জাভা কেন অনুমান টাইপ করে না?


44

আমি সবসময়ই ভাবছিলাম যে জাভা কেন ভাষা টাইপ ইনফারেন্সটি দেয় না কারণ ভাষাটি এটি কী, এবং এর ভিএম খুব পরিপক্ক। গুগলের গো চমত্কার প্রকারের অনুক্রম সহ একটি ভাষার উদাহরণ এবং এটি টাইপিংয়ের পরিমাণ হ্রাস করে। এই বৈশিষ্ট্যটি জাভার অংশ না হওয়ার পিছনে কি কোনও বিশেষ কারণ রয়েছে?


3
পিছনে জাভা হিসাবে পুরানো এবং জনপ্রিয় হিসাবে একটি ভাষাতে সামঞ্জস্যতা বিধি
ratchet freak

9
@ratchetfreak পিছনে সামঞ্জস্যপূর্ণ উপায়ে যুক্ত অনুগ্রহ যুক্ত করা যাবে না? পুরানো প্রোগ্রামগুলি কেবল প্রয়োজনের চেয়ে আরও বেশি ধরণের তথ্য সরবরাহ করবে।

1
টাইপ ইরেজরের সাথে ব্যবহার করার সময় এর কিছু অযাচিত প্রভাব থাকতে পারে। docs.oracle.com/javase/tutorial/java/generics/…
জাচারি ইয়েটস

4
নোট করুন যে জাভা 8 এর ল্যাম্বদা বৈশিষ্ট্যের সাথে প্রচুর প্রকারের আনমন আনবে : আপনি কোনও ধরণের এবং সমস্ত কিছু অনুমিত না করে জটিল ল্যাম্বডাস লিখতে পারেন।
জোছিম সৌর

4
স্থানীয় পরিবর্তনশীল ধরণের অনুমিতি জাভাতে আসছে: JEP 286: লোকাল-ভেরিয়েবল টাইপ অনুকরণ
জিমি পৃষ্ঠা

উত্তর:


60

প্রযুক্তিগতভাবে বলতে গেলে, জেনেরিকগুলি ব্যবহার করার সময় জাভাতে টাইপ ইনফারেন্সিং থাকে । একটি জেনেরিক পদ্ধতি মত

public <T> T foo(T t) {
  return t;
}

সংকলক বিশ্লেষণ করবে এবং বুঝতে পারবে যে আপনি যখন লিখবেন

// String
foo("bar");
// Integer
foo(new Integer(42));

আর্গুমেন্ট হিসাবে ইনপুট কী ছিল তার ভিত্তিতে প্রথম কলের জন্য একটি স্ট্রিং এবং দ্বিতীয় কলটির জন্য একটি পূর্ণসংখ্যা ফেরত দেওয়া হচ্ছে। ফলস্বরূপ আপনি সঠিক সংকলন-সময় চেকিং পাবেন। অতিরিক্তভাবে, জাভা 7-তে, জেনারিকগুলি ইনস্ট্যান্ট করার সময় কেউ কিছু অতিরিক্ত ধরণের ইনফারেন্সিং পেতে পারে

Map<String, String> foo = new HashMap<>();

জাভা আমাদের জন্য ফাঁকা কোণ বন্ধনী পূরণ করার জন্য যথেষ্ট সদয়। এখন কেন জাভা ভেরিয়েবল অ্যাসাইনমেন্টের অংশ হিসাবে ইনফারেন্সিং টাইপ করে না ? এক পর্যায়ে ভেরিয়েবল ঘোষণায় টাইপ ইনফারেন্সিংয়ের জন্য একটি আরএফই ছিল , তবে এটি "ঠিক করবে না" বলে বন্ধ করা হয়েছিল কারণ

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

যে অবদানকারী এটি বন্ধ করেছিল তারা আরও উল্লেখ করেছে যে এটি কেবল "আন-জাভা-জাতীয়" বোধ করে, যার সাথে আমি একমত হই। জাভার ভার্বোসটি একটি আশীর্বাদ এবং অভিশাপ উভয়ই হতে পারে, তবে এটি ভাষাটি কী তা তৈরি করে।

অবশ্যই সেই বিশেষ আরএফই সেই কথোপকথনের শেষ ছিল না। জাভা During-এর সময়, এই বৈশিষ্ট্যটি আবার বিবেচনা করা হয়েছিল , কিছু পরীক্ষা বাস্তবায়ন তৈরি হয়েছিল, যার মধ্যে একটি স্বয়ং জেমস গোসলিংও করেছিলেন। আবার, এই বৈশিষ্ট্যটি শেষ পর্যন্ত নিচে নামিয়ে দেওয়া হয়েছিল।

জাভা 8 প্রকাশের সাথে সাথে, আমরা এখন ল্যাম্বডাসের অংশ হিসাবে টাইপ অনুকরণটি পাই:

List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));

জাভা সংকলক পদ্ধতিটি দেখতে Collections#sort(List<T>, Comparator<? super T>)এবং তারপরে ইন্টারফেসটি দেখতে Comparator#compare(T o1, T o2)এবং এটি নির্ধারণ করতে সক্ষম হয় firstএবং এটি secondএমনভাবে হওয়া উচিত Stringযাতে ল্যাম্বডা এক্সপ্রেশনটিতে টাইপটি পুনরায় চালু করতে প্রোগ্রামারটিকে যেতে দেওয়া হয়।


5
First, the redundant type serves as valuable documentation - readers do not have to search for the declaration of getMap() to find out what type it returns- হ্যাঁ, যদি তা হয় HashMap<String, Integer> map = foo.getMap()তবে আমি সম্মত হই - সি # তে আমি সাধারণত varএমন ক্ষেত্রে ব্যবহার করি না , যদিও আমি পারতাম। তবে এই যুক্তিটি যদি জল থাকে তবে তা ধরে রাখে না HashMap<String, Integer> map = new HashMap<String, Integer>()। এটি সত্যই অপ্রয়োজনীয় এবং আমি টাইপের নামটি দু'বার লিখতে কোনও লাভ দেখছি না। এবং আমি এখানে একটি সংকলক ক্রস চেক থেকে কীভাবে উপকৃত হব, আমি কিছুই বুঝতে পারি না।
কনরাড মোরাউস্কি

9
হ্যাঁ এবং এটি জেনারিকদের পক্ষে ভাল তবে আমি varজাভাতে সি # এর সমতুল্য মিস করছি ।
কনরাড মোরাউস্কি

15
এটি "আন-জাভা-সদৃশ" হওয়ার মতো, এই (চিত্তাকর্ষক) গল্পটি মাথায় আসে;) 9gag.com/gag/2308699/-th-is-how-things-are-done-around-here
Konrad Morawski

6
তদ্ব্যতীত, কোনও ফাংশনের রিটার্নের ধরনটি প্রায়শই স্পষ্ট বা অপ্রয়োজনীয় হয় এবং এমনকি আপনার আইডিই নয় এমন ক্ষেত্রেও অর্ধ সেকেন্ডের মধ্যে টাইপটিকে ফ্ল্যাগ আপ করতে পারে।
ফোশি

8
আমি বিশ্বাস করি যে সরকারী উক্তিটি Humans benefit from the redundancyবর্তমান প্রশ্নের আসল উত্তর, কারণ আমি যে প্রতিটি যুক্তি পড়েছি তা জাভা ডিজাইনারদের কাছ থেকে অকার্যকর, ভিত্তিহীন এবং হাস্যকর অজুহাত বলে মনে হচ্ছে: সি # এবং সি ++ উভয়ই বৈশিষ্ট্যটি রয়েছে, সি # এবং সি ++ ডিজাইনাররা এর চেয়ে কম দক্ষ নন জাভা এবং সকলেই এটি ব্যবহার করে খুশি। এটি কী এমন কারণ যা জাভা বিকাশকারীদের সি # বা সি ++ বিকাশকারীদের থেকে আলাদা হতে পারে? এই কারণেই আমি @ কনরাডমোরউসকির সাথে একমত, "এখানে এইভাবে জিনিসগুলি করা হয়" এরপরে আবার আসল কারণ বলে মনে হয়
প্যারেসবাল

16

ভাল, প্রথমে, টাইপ অনুমানটির রানটাইমের পরিপক্কতার সাথে কোনও সম্পর্ক নেই , সেই রানটাইমটি 30 বছরের পুরনো সিপিইউ বা ভিএম এতই নতুন যে বিটগুলি এখনও চকচকে। এটা সব সংকলক সম্পর্কে।

এটি বলেছিল যে এটি জেনেরিকদের জন্য অনুমোদিত, কারণ নন-জেনেরিক প্রকারের জন্য এটি অনুমোদিত না হওয়ার কারণ দর্শনের কারণ বলে মনে হচ্ছে - ডিজাইনারদের এটি যুক্ত করা থেকে বিরত করার কিছুই নেই।

আপডেট: দেখে মনে হচ্ছে জাভা 10 এটি সমর্থন করে —- http://openjdk.java.net/jeps/286


5

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

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

আমি জানি না ভবিষ্যতে জাভা টাইপ অনুমান পাবে কিনা তবে আইএমও ভাষাটির জন্য এটি একটি বড় বিপ্লব হবে (যেমন গ্লেন নেলসন উল্লেখ করেছেন, এটি "জাভা-জাতীয়" হিসাবে বর্ণনা করা হয়েছিল) এবং তারপরে কেউ এটিকে বাদ দেওয়ার বিষয়টি বিবেচনা করতে পারে একটি নতুন নামের পক্ষে জাভা নাম দিন।

আপনি যদি টাইপ অনুক্রমের সাথে একটি JVM ভাষা ব্যবহার করতে চান তবে আপনি স্কালা ব্যবহার করতে পারেন।


2

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


8
গ্রিডব্যাগলয়আউট গ্রিডব্যাগ কীভাবে = নতুন গ্রিডব্যাগলয়েট (); স্ব নথিভুক্ত করতে চান? এর খাঁটি পুনরাবৃত্তি।
অ্যান্ডার্স লিন্ডন

3
এটি এমন একটি ক্ষেত্রে থেকে বিচ্ছিন্ন হয় যেখানে দুটি ধরণের এক নয়। আপনি কেবল সহজেই একটি সাবক্লাসের উদাহরণ সাইন করতে পারেন।
জিগি

Let's say you want to use a List, but someone comes along and uses a method exclusive to ArrayList. The JIT would infer an ArrayList and carry on even if you wanted a compilation error- আমি এই বিট বুঝতে পারি না। কোনও ভেরিয়েবলকে তাত্পর্যপূর্ণ করার জন্য, এতে কোনও পদ্ধতিতে কল না দেওয়ার মুহুর্তে টাইপ অনুমানটি ঘটে। আপনি কী বোঝাতে চেয়েছিলেন আপনি সম্ভবত একটি উদাহরণ প্রদর্শন করতে পারেন?
কনরাড মোরাউস্কি

2
@ কনরাডমোরাউস্কি: আমি ধরে নিয়েছি তার অর্থ হ'ল কোনও পদ্ধতি যদি অ্যারেলিস্টকে ফেরত দেয় তবে এই ধরণের অনুমান করা হবে। আপনি যদি কোনও প্রকারকে রিটার্নের ধরণ ছাড়া অন্য কিছু হিসাবে বিবেচনা করতে চান তবে আপনি অনুমান ব্যবহার করতে পারবেন না। যদিও বুঝতে পারি না যে এটি সান কাছাকাছি কোথাও কোনও কোডবেজে কোনও সমস্যা হতে পারে।
ফোশি

জেআইটি প্রকারভেদে কোনও অংশই খেলবে না। টাইপ অনুমান একটি সংকলন-সময় ঘটনা on এবং যদি কোনও ভেরিয়েবল কোনও তালিকার রেফারেন্স হিসাবে ঘোষণা করা হয়, এতে অ্যারেলিস্টের সদস্যদের অ্যাক্সেস করার চেষ্টা করা চেক টাইপ করবে না এবং আপনি একটি সংকলন ত্রুটি পাবেন
সারা

0

এটি আপনার প্রয়োজন অনুসারে সবচেয়ে জেনেরিক ইন্টারফেস ব্যবহার করে ভেরিয়েবলগুলি ঘোষণার জন্য সুপ্রতিষ্ঠিত সুপারিশটির বিরোধিতা করে এবং যথাযথ বাস্তবায়নকারী ক্লাসের মতো শুরু করে

Collection<String> names = new ArrayList<>();

কার্যকরীভাবে,

var names = new ArrayList<String>();

সিনট্যাকটিক চিনি ছাড়া কিছুই নয়

ArrayList<String> names = new ArrayList<String>();

যদি আপনি এটি চান, আপনার আইডিই এটি new ArrayList<String>()"এক ক্লিক" (রিফ্যাক্টর / স্থানীয় পরিবর্তনশীল তৈরি) দিয়ে এক্সপ্রেশন থেকে তৈরি করতে পারে তবে মনে রাখবেন যে এটি "ব্যবহার ইন্টারফেসগুলি" সুপারিশের সাথে বিরোধী।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.