জাভা 6 বনাম জাভা 7 এর মধ্যে অটো-আনবক্সিংয়ের পার্থক্য


107

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

এখানে একটি সাধারণ উদাহরণ:

Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

এটি জাভা এসই from থেকে জাভ্যাকের সাথে জরিমানা সংকলন করে তবে আমি যদি সংকলকটিকে "-স্রোত 1.6" যুক্তিটি দিয়ে থাকি তবে আমি শেষ লাইনে একটি ত্রুটি পেয়েছি:

inconvertible types
found   : java.lang.Object
required: int

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

তাহলে কি দেয়? আরও কিছু পরীক্ষা-নিরীক্ষা থেকে মনে হয় জাভা 6-এ আনবক্সিং কেবলমাত্র আনবক্স মানগুলিকেই সাফ করতে পারে (স্পষ্ট সংকলন সময়ে) বাক্সযুক্ত ধরণের। উদাহরণস্বরূপ, এটি উভয় সংস্করণে কাজ করে:

Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

সুতরাং মনে হচ্ছে জাভা and থেকে 7 এর মধ্যে আনবক্সিং বৈশিষ্ট্যটি উন্নত করা হয়েছিল যাতে এটি কাস্ট করতে পারে এবং আনবক্সের অবজেক্টের ধরণগুলিকে এক ঝাঁকুনিতে ফেলে রাখতে পারে, না জেনে (কম্পাইল সময়ে) মানটি সঠিক বক্সড টাইপের। তবে জাভা Spec-এর সময়ে লেখা জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন বা ব্লগ পোস্টিংগুলি পড়ার পরে আমি এই জিনিসের কোনও পরিবর্তন দেখতে পাচ্ছি না, তাই আমি ভাবছি যে পরিবর্তনটি কী এবং এই "বৈশিষ্ট্যটি" কী বলা হয় ?

কেবল একটি কৌতূহল: পরিবর্তনের কারণে "ভুল" আনবক্সিংগুলি ট্রিগার করা সম্ভব:

Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];

এটি সূক্ষ্ম সংকলন করে তবে রানটাইমটিতে একটি ক্লাসকাস্টএক্সসেপশন দেয়।

এ সম্পর্কে কোন রেফারেন্স?


17
মজাদার. অটোবক্সিং মেসের জন্য একটি নতুন উপাদান। আমি মনে করি আপনার উদাহরণটি অ্যারের পরিবর্তে একক বস্তুর সাথে আরও সহজ এবং পরিষ্কার হতে পারে। Integer obj = new Integer(2); int x = (int)obj;: জাভা 7 কাজ, 6. জাভা তে থাকা ত্রুটির দেয়
leonbloy

1
আপনি কোন জেডিকে ব্যবহার করছেন? এটি বিভিন্ন বিক্রেতাদের সাথেও করতে পারে ...
বারফুইন

1
@ লেওনব্লয়: সরলীকরণ সম্পর্কে ভাল বক্তব্য, আমি এটিকে কিছুটা সরল করেছিলাম (আমার মূল কোড থেকে) তবে একরকম খুব তাড়াতাড়ি বন্ধ হয়ে গেছে!
মর্তি

@ থমাস: এটি আমি ব্যবহার করা ওরাকল থেকে সর্বশেষ জেডিকে (প্রতিটি সংস্করণের জন্য) ছিল।
মর্তি

2
অটোবক্সিং কখনই ব্যবহার না করার আরেকটি কারণ।
গাইর্জ্যাব্রাহাম

উত্তর:


92

জাভা 5/6 জেএলএস-এর একই বিভাগের তুলনায় জাভা 7 জেএলএসের কাস্টিং রূপান্তর 5.5 বিভাগে ভাষাটি মনে হয়েছে সম্ভবত অনুমোদিত রূপান্তরগুলি স্পষ্ট করার জন্য।

জাভা 7 জেএলএস বলেছে

কোনও রেফারেন্স ধরণের অভিব্যক্তি আনবক্সিং রূপান্তর দ্বারা ত্রুটি ছাড়াই আদিম ধরণের রূপান্তরকরণের মধ্য দিয়ে যেতে পারে।

জাভা 5/6:

একটি রেফারেন্স টাইপের একটি মান আনবক্সিং রূপান্তর (§5.1.8) দ্বারা একটি আদিম প্রকারে কাস্ট করা যেতে পারে।

জাভা 7 জেএলএসে আদিমগুলিতে রেফারেন্স ধরণের থেকে অনুমতিপ্রাপ্ত রূপান্তরগুলির একটি টেবিল (টেবিল 5.1) রয়েছে (জাভা 5/6 জেএলএসে এই টেবিলটি অন্তর্ভুক্ত নয়)। এটি আনবক্সিংয়ের সাথে সংকীর্ণ রেফারেন্স রূপান্তর হিসাবে অবজেক্ট থেকে আদিমগুলিতে স্পষ্টভাবে কাস্টগুলি তালিকাভুক্ত করে।

কারণটির এই ইমেলটিতে ব্যাখ্যা করা হয়েছে :

নীচের লাইন: যদি অনুমান। অনুমতি দেয় (অবজেক্ট) (ইনট) এটি অবশ্যই (ইনট) (অবজেক্ট) এর অনুমতি দিচ্ছে।


35

তুমি ঠিক; আরও সহজভাবে বলতে:

Object o = new Integer(1234);
int x = (int) o;

এটি জাভা 7 এ কাজ করে তবে জাভা 6 এবং নীচে একটি সংকলন ত্রুটি দেয়। আশ্চর্যজনকভাবে, এই বৈশিষ্ট্যটি সুস্পষ্টভাবে ডকুমেন্টেড নয়; উদাহরণস্বরূপ, এটি এখানে উল্লেখ করা হয় নি । এটি বিতর্কযোগ্য যদি এটি কোনও নতুন বৈশিষ্ট্য বা বাগ ফিক্স (বা একটি নতুন বাগ?), কিছু সম্পর্কিত তথ্য এবং আলোচনা দেখুনSpecক্যমত্যটি মূল অনুমানের একটি অস্পষ্টতার দিকে ইঙ্গিত করে বলে মনে হচ্ছে , যার ফলে জাভা ৫/ on-তে কিছুটা ভুল / অসামঞ্জস্য বাস্তবায়ন হয়েছিল, যা ১৯৯ in সালে স্থির হয়েছিল, কারণ এটি জেএসআর ২৯২ (গতিযুক্ত টাইপড ল্যাঙ্গুয়েজস) বাস্তবায়নের জন্য গুরুত্বপূর্ণ ছিল।

জাভা অটোবক্সিংয়ে এখন আরও কয়েকটি ফাঁদ এবং চমক রয়েছে। উদাহরণ স্বরূপ

Object obj = new Integer(1234);
long x = (long)obj;

সংকলন করবে, তবে ব্যর্থ হবে (সহ) ClassCastException রানটাইমে )। এটি পরিবর্তে, কাজ করবে:

long x = (long)(int)obj;


2
উত্তর করার জন্য ধন্যবাদ. তবে, একটি জিনিস আমি বুঝতে পারি না। এটি জেএলএস এবং তার সাথে বাস্তবায়নগুলি (সিএফ। মেল আলোচনা) এর স্পষ্টতা, তবে কেন এটি জেভিএমে অন্যান্য টাইপ করা ভাষাগুলি সংযোজন করার জন্য করা হবে? সর্বোপরি, এটি ভাষায় একটি পরিবর্তন, ভিএম নয়: ভিএম এর ingালাই আচরণটি সর্বদা যেমন কাজ করে, সংকলকটি এই বৈশিষ্ট্যটি প্রয়োগ করে ইন্টিজারে কাস্টিং এবং .intValue () কল করার জন্য বিদ্যমান প্রক্রিয়াটি ব্যবহার করে। তাহলে জাভা ভাষার এই পরিবর্তনটি কীভাবে উপযুক্ত হতে পারে, ভিএম-তে অন্য ভাষাগুলি চালাতে সহায়তা করে? আমি আপনার লিঙ্কটি সম্মতি জানাই, অবাক হয়ে।
মর্তি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.