প্রথম জিনিসটি মনে রাখবেন যে জাভা টার্নারি অপারেটরগুলির একটি "টাইপ" রয়েছে এবং এটিই দ্বিতীয় এবং তৃতীয় প্যারামিটারের প্রকৃত / আসল ধরণের কী তা নির্ধারণ করে বিবেচনা করবে এবং সংকলক বিবেচনা করবে। বিভিন্ন উপাদানগুলির উপর নির্ভর করে জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন 15.26 তে বর্ণিত হিসাবে টার্নারি অপারেটর প্রকারটি বিভিন্ন উপায়ে নির্ধারিত হয়
উপরের প্রশ্নে আমাদের শেষ মামলাটি বিবেচনা করা উচিত:
অন্যথায়, দ্বিতীয় এবং তৃতীয় অপারেশনগুলি যথাক্রমে এস 1 এবং এস 2 ধরণের । যাক T1 এর ধরণ যে বক্সিং রূপান্তর আবেদন থেকে ফলাফল হতে S1 , এবং দিন T2 ধরনের হতে যে বক্সিং রূপান্তর আবেদন থেকে ফলাফল , S2 । শর্তসাপেক্ষ প্রকাশের প্রকারটি হ'ল ক্যাপচার রূপান্তর (§5.1.10) প্রয়োগ করে (টি 1, টি 2) (.115.12.2.7)।
একবারে একবারে ক্যাপচার রূপান্তর (§5.1.10) প্রয়োগ করে এবং বেশিরভাগটি লাবের (টি 1, টি 2) প্রয়োগ করার পরে এটি সবচেয়ে জটিল কেস ।
সরল ইংরেজিতে এবং একটি চূড়ান্ত সরলকরণের পরে আমরা প্রক্রিয়াটিকে দ্বিতীয় এবং তৃতীয় পরামিতিগুলির "সর্বনিম্ন প্রচলিত সুপারক্লাস" (হ্যাঁ, এলসিএম ভাবুন) গণনা হিসাবে বর্ণনা করতে পারি। এটি আমাদের টার্নারি অপারেটরকে "টাইপ" দেবে। আবার, আমি যা বলেছি তা হ'ল চূড়ান্ত সরলীকরণ (একাধিক সাধারণ ইন্টারফেস প্রয়োগকারী ক্লাসগুলি বিবেচনা করুন)।
উদাহরণস্বরূপ, যদি আপনি নিম্নলিখিতটি চেষ্টা করেন:
long millis = System.currentTimeMillis();
return(true ? new java.sql.Timestamp(millis) : new java.sql.Time(millis));
আপনি লক্ষ্য করবেন যে শর্তসাপেক্ষ প্রকাশের ফলে প্রাপ্ত ধরনটি java.util.Date
এটি Timestamp
/ Time
জুটির জন্য "সর্বনিম্ন প্রচলিত সুপারক্র্লাস" since
যেহেতু null
যে কোনও কিছুর সাথে অটোবক্স করা যেতে পারে, "সর্বনিম্ন প্রচলিত সুপারক্লাস" Integer
ক্লাস এবং এটি উপরের শর্তসাপেক্ষ এক্সপ্রেশন (টার্নারি অপারেটর) এর রিটার্ন টাইপ হবে। তারপরে রিটার্ন মানটি প্রকারের নাল পয়েন্টার Integer
হবে এবং এটিই টের্নারি অপারেটর ফিরিয়ে দেবে।
রানটাইমের সময়, যখন জাভা ভার্চুয়াল মেশিনটি আনবক্স করে Integer
একটি NullPointerException
নিক্ষেপ করা হয়। এটি ঘটায় কারণ জেভিএম ফাংশনটি চালু করার চেষ্টা করে null.intValue()
, যেখানে null
অটোবক্সিংয়ের ফলাফল।
আমার মতে (এবং যেহেতু আমার মতামত জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনে নেই তাই অনেক লোক যেভাবেই এটিকে ভুল দেখতে পাবেন) সংকলকটি আপনার প্রশ্নের অভিব্যক্তিটি মূল্যায়নের ক্ষেত্রে একটি খারাপ কাজ করে। আপনি লিখেছেন যে দেওয়াtrue ? param1 : param2
সংকলকটি তা অবিলম্বে নির্ধারণ করা উচিত যে প্রথম প্যারামিটার - null
- ফিরিয়ে দেওয়া হবে এবং এটি একটি সংকলক ত্রুটি তৈরি করবে। এটি আপনি লেখার সময় কিছুটা অনুরূপ while(true){} etc...
এবং সংকলকটি লুপের নীচে কোড সম্পর্কে অভিযোগ করে এবং এটিতে ফ্ল্যাগ করে Unreachable Statements
।
আপনার দ্বিতীয় কেসটি বেশ সোজাসাপ্টা এবং এই উত্তরটি ইতিমধ্যে খুব দীর্ঘ ...;)
সংশোধন:
অন্য বিশ্লেষণের পরে আমি বিশ্বাস করি যে আমার কাছে ভুল ছিল যে কোনও null
কিছুর সাথে একটি মান বাক্সড / অটোবক্স করা যায়। শ্রেণীর পূর্ণসংখ্যা সম্পর্কে কথা বললে, স্পষ্ট বক্সিং বক্সিংটি new Integer(...)
কনস্ট্রাক্টরকে অনুরোধ করতে পারে বা সম্ভবত Integer.valueOf(int i);
(আমি এই সংস্করণটি কোথাও খুঁজে পেয়েছি) consists প্রাক্তনটি একটি নিক্ষেপ করবে NumberFormatException
(এবং এটি ঘটে না) যখন দ্বিতীয়টি বোঝাতে int
পারে না কারণ এটি হতে পারে না null
...
int foo = (true ? null : 0)
এবংnew Integer(null)
উভয়ই জরিমানা সংকলন করে, দ্বিতীয়টি অটোবক্সিংয়ের স্পষ্ট রূপ।