জাভাতে কি অটো টাইপ অনুমান করা হচ্ছে?


113

autoজাভাতে কি আপনার মতো সি ++ এর মতো কোনও পরিবর্তনশীল ধরণ রয়েছে?

একটি উদাহরণ:

for ( auto var : object_array)
    std::cout << var << std::endl;

for( auto var : object_array)
    var.do_something_that_only_this_particular_obj_can_do();

আমি জানি যে জাভাতে লুপের জন্য একটি বর্ধিত আছে, তবে সেখানে কোনও অটো আছে? তা না হলে এই কাজ করার জন্য কি হ্যাক আছে? আমি সি ++ 11 এ নতুন বৈশিষ্ট্যটি উল্লেখ করছি


1
মৌলিক ধরণের ব্যতীত সমস্ত কিছু ধরণের পরিবর্তকের জন্য বরাদ্দ করা যেতে পারে Object, তাই কিছু ক্রিয়াকলাপের জন্য, আপনি Objectযেখানে চান সেখানে ব্যবহার করতে পারেন auto
জাইএক্স 2000

1
কোনও জাভাতে এর মতো কোনও চলক নেই
আলেক্সেই বুলগাক

@ জাইএক্স 2000: তারপরে, এটি অবজেক্টের to_stringফাংশনটি ব্যবহার করবে , এবং আসল বস্তুটি প্রশ্নে নেই, তাই না?
গেমস ব্রেনিয়াক

2
@ গেমস ব্রেনিয়াক: না, যদি এটি বিদ্যমান থাকে তবে এটি ওভাররাইড সংস্করণ ব্যবহার করবে।
কেপিল

2
আপনি যে শব্দটির সন্ধান করছেন সেটি "অটো" নয়, এটি "টাইপ অনুমান"। জাভাতে টাইপ অনুমান সম্পর্কে বেশ কয়েকটি প্রশ্ন রয়েছে, যদিও তারা বেশিরভাগ

উত্তর:


49

উত্তর আগে প্রশ্ন ছিল সম্পাদিত :

না autoজাভাতে কোনও ভেরিয়েবল টাইপ নেই । একই লুপটি অর্জন করা যেতে পারে:

for ( Object var : object_array)
  System.out.println(var);

জাভাতে স্থানীয় ভেরিয়েবল রয়েছে, যার স্কোপটি ব্লকের মধ্যে যেখানে সেগুলি সংজ্ঞায়িত করা হয়েছে। সি এবং সি ++ এর মতো, তবে কোনও অটো বা নিবন্ধক কীওয়ার্ড নেই। তবে জাভা সংকলকটি স্পষ্টত নয়-স্থানীয়ভাবে স্থানীয় ভেরিয়েবল ব্যবহারের অনুমতি দেয় না এবং সংকলন ত্রুটি দেয় (সি এবং সি ++ এর বিপরীতে যেখানে সংকলক সাধারণত কেবল একটি সতর্কতা দেয়)। সৌজন্যে: উইকিপিডিয়া

না, জাভাতে সি ++ এর মতো কোনও মূলধারার ধরণ-অনুকরণ নেই। একটি আরএফই ছিল তবে এটি "সংশোধন করবে না" হিসাবে বন্ধ ছিল, কারণ দেওয়ার কারণটি ছিল:

টাইপ ডিক্লেয়ারেশনকে দু'ভাবে উপকারের ফলে মানুষ উপকৃত হয়। প্রথমত, রিডানড্যান্ট টাইপটি মূল্যবান ডকুমেন্টেশন হিসাবে কাজ করে - পাঠকরা কী ধরনের ফিরে আসে তা খুঁজে পাওয়ার জন্য getMap () ঘোষণার জন্য অনুসন্ধান করতে হবে না। দ্বিতীয়ত, রিডানডেন্সি প্রোগ্রামারকে পছন্দসই প্রকারটি ঘোষণা করতে দেয় এবং এর মাধ্যমে সংকলক দ্বারা সম্পাদিত ক্রস চেক থেকে উপকৃত হয়।


10
@ গেমস ব্রেনিয়াক নং, পদ্ধতি কলগুলি সর্বদা জাভাতে বহুমুখী থাকে। তবে, আরও অনেকগুলি জিনিস (যেমন ওভারলোড রেজোলিউশন, বা কোনও অপারেশন সংজ্ঞায়িত নয় Object) এইভাবে করা যায় না। এটি আসলে একটি ভাল উত্তর নয়, এটি শুধুমাত্র কাজেই ঘটে কারণ প্রশ্নের উদাহরণটি দুর্বল।

10
এই প্রশ্নটি সি ++ 11-তে প্রকার অনুকরণ সম্পর্কে, autoসি ও প্রাক-সি ++ 11 এর পুরানো ব্যবহার সম্পর্কে নয় । আপনার সম্পাদনা প্রসঙ্গ বন্ধ।

4
"আমি যা বোঝাতে চাইছিলাম তা নয়, আপনি একবার এটি কোনও বস্তুতে ফেলে ফেললে এটি আপনাকে অবজেক্টের টু স্ট্রিং দেবে" মিথ্যা। একেবারে 100% মিথ্যা।
লুই ওয়াসারম্যান

140
"অপ্রয়োজনীয়তা থেকে মানুষ উপকৃত হয়।" এটা সত্যি. প্রতিদিন সকালে ঘুম থেকে উঠে মনে হয় "আমি কীভাবে আমার কোডটিকে আরও বেশি জাল করতে পারি?" " কারণ সুবিধার।
এহোফার 19

2
var
তবুও

69

জাভা 10 হতে পারে varকীওয়ার্ডের মাধ্যমে আপনি (এবং আমি) যা চান তা থাকতে পারে ।

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

থেকে JDK এনহান্সমেন্ট প্রস্তাব 286


আপডেট: হ্যাঁ , সেই বৈশিষ্ট্যটি এটি জাভা 10 রিলিজে তৈরি করেছে!


6
ইয়া এটির উন্নতি, তবে সেই কীওয়ার্ডটি কেবল স্থানীয় ভেরিয়েবলগুলির সাথে কাজ করতে পারে। সি ++ স্বয়ংক্রিয় প্রকারের
অনুক্রমের

7
গৌণ নিট-পিক: varকোনও কীওয়ার্ড নয়! জেএলএস থেকে : "ভার একটি মূলশব্দ নয়, বরং স্থানীয় ভেরিয়েবল ঘোষণার ধরণ হিসাবে বিশেষ অর্থ সহ একটি সনাক্তকারী"। সুতরাং, কীওয়ার্ডগুলির বিপরীতে, আপনাকে ভেরিয়েবল বা কোনও পদ্ধতিতে "ভার" বলা বন্ধ করার কিছুই নেই।
ক্লিটোস কিরিয়াকু

2
ভাল পয়েন্ট @ ক্লিটোস কিরিয়াকৌ। তবুও, যদি আমি 'কীওয়ার্ড' কে 'আইডেন্টিফায়ার' - বা এমনকি 'স্থানীয় ভেরিয়েবল ডিক্লেয়ারেশনের ধরণ হিসাবে বিশেষ অর্থ সহ সনাক্তকারী' দিয়ে প্রতিস্থাপন করার কল্পনা করি - তবে উত্তরটি কম পরিষ্কার হবে বলে আমি মনে করি। তবে হ্যাঁ, varকীওয়ার্ডের তালিকায় নেই।
দুঃখিতমিসিজ্যাকসন

এটি কেবল পশ্চাদপদ সামঞ্জস্যের জন্য কোনও কীওয়ার্ড নয়। এই নামের সাথে আপনার কোনও শনাক্তকারী থাকতে পারে তা ছাড়াও var কোনও কীওয়ার্ডের ভূমিকা পালন করে।
ফেসবুকে

25

জাভা 7 হীরা সিনট্যাক্স উপস্থাপন করে

Box<Integer> integerBox = new Box<>(); // Java 7

পুরানো জাভা তুলনায়

Box<Integer> integerBox = new Box<Integer>(); // Before Java 7

সমালোচক পাঠক লক্ষ্য করবেন যে এই নতুন বাক্য গঠনটি মূল প্রশ্নে লুপগুলি লেখার ক্ষেত্রে সহায়তা করে না। এটি সঠিক এবং সম্পূর্ণ ইচ্ছাকৃত বলে মনে হয়। অন্যান্য উত্তরটি দেখুন যা ওরাকলের বাগ ডাটাবেসটিকে উদ্ধৃত করে।


4
সত্য, তবে তিনি (এবং আমি) যা খুঁজছেন তা হ'ল: auto integerBox = new Box<Integer>();এটি সাধারণত কোনও ফাংশন থেকে রিটার্নের মান পাওয়ার জন্য ব্যবহৃত হয় যা কখনও কখনও জটিল করা যায়HashMap<String, LinkedList<Operation, Set<Integer>>>
রোই গাভিরেল

1
সেই উদ্বেগটি হ'ল কোডের নমুনার পরে ঠিক কী আমি সম্বোধন করেছি। উপসংহারটি ছিল যে জাভা এটি করে না, এবং এটিই উদ্দেশ্য।
টারাসাচ

18

জাভা 8-এ, আপনি প্রকারটি ঘোষণা থেকে বাঁচতে ল্যাম্বদা টাইপের অনুক্রম ব্যবহার করতে পারেন। প্রশ্নকারীর উদাহরণগুলির অ্যানালগটি হ'ল:

object_array.forEach(var -> System.out.println(var)); 
object_array.forEach(var -> var.do_something_that_only_this_particular_obj_can_do());

উভয়ই পদ্ধতি রেফারেন্স ব্যবহার করে সরল করা যেতে পারে:

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);

8

সংক্ষেপে, না, কোনও অটো টাইপ নেই। আপনি যদি সব করছেন মানটি মুদ্রণ করা হয় তবে আপনি কেবল মান হিসাবে উল্লেখ করতে পারেন Object


অথবা কম্পিউটিং hashCode, বা শ্রেণীর নাম সংগ্রহ, বা ... আপনি ধারণাটি পেয়েছেন;) তালিকাটি সংক্ষিপ্ত, যদিও। অবজেক্ট ক্লাসের ডকগুলি দেখুন (নতুনদের জন্য মন্তব্য বোঝার জন্য, আমি নিশ্চিত যে আপনি এটি সিমোনসি জানেন)
আলেকজান্ডার

4

এটি খাঁটি জাভা সমাধান নয়, তবে লম্বক নামক একটি লাইব্রেরি যুক্ত করা নিচের যাদুটিকেauto সি ++ এর মূলশব্দের মতো সংকলন করতে এবং কাজ করতে সক্ষম করবে

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.