কারণগুলি বরং জটিল, তবে সেগুলি সমস্ত জাভা ভাষার স্পেসিফিকেশনের বিবরণে ( যদি আপনি চান তবে সূক্ষ্ম মুদ্রণ )।
প্রথমত, জেএলএস 14.11switch
বিবৃতি সম্পর্কে নিম্নলিখিতটি বলেছেন:
"স্যুইচ স্টেটমেন্টের সাথে যুক্ত প্রতিটি ক্ষেত্রে ধ্রুবক অবশ্যই সুইচ স্টেটমেন্টের এক্সপ্রেশন ( §5.2 ) এর ধরণের সাথে সামঞ্জস্যপূর্ণ অ্যাসাইনমেন্ট হতে হবে ।"
এর অর্থ এই যে 'a'
হস্তান্তরযোগ্য হতে প্রয়োজন Integer
এবং Byte
যথাক্রমে।
তবে এটি ঠিক শোনাচ্ছে না:
আপনি ভাববেন যেহেতু 'a'
একটি নিয়োগযোগ্য হওয়া উচিতInteger
কারণ char
-> int
নিয়োগটি আইনী। (কোনও char
মান একটি মধ্যে মাপসই করা হবে int
।)
আপনি মনে হবে যে যেহেতু 'a'
করা উচিত হবে না একটি থেকে হস্তান্তরযোগ্য Byte
কারণ char
-> byte
নিয়োগ না বৈধ। (বেশিরভাগ char
মান একটি বাইটের সাথে খাপ খায় না))
আসলে, এগুলির কোনওটিই সঠিক নয়। কেন তা বোঝার জন্য, আমাদের জেলিএসএস 5.2 অ্যাসাইনমেন্ট প্রসঙ্গে যা অনুমোদিত তা সম্পর্কে আসলে কী পড়তে হবে ।
"অ্যাসাইনমেন্ট প্রসঙ্গে নিম্নলিখিতগুলির মধ্যে একটির ব্যবহারের অনুমতি দেয় :
- একটি পরিচয় রূপান্তর (.15.1.1)
- একটি প্রসারিত আদিম রূপান্তর (.15.1.2)
- একটি প্রসারিত রেফারেন্স রূপান্তর (.15.1.5)
- একটি বিস্তৃত রেফারেন্স রূপান্তর যার পরে একটি আনবক্সিং রূপান্তর
- একটি বিস্তৃত রেফারেন্স রূপান্তর এর পরে একটি আনবক্সিং রূপান্তর, তারপরে প্রসারিত আদিম রূপান্তর
- একটি বক্সিং রূপান্তর (.15.1.7)
- একটি বক্সিং রূপান্তর এর পরে আরও প্রশস্ত রেফারেন্স রূপান্তর
- একটি আনবক্সিং রূপান্তর (.15.1.8)
- একটি আনবক্সিং রূপান্তর এর পরে প্রসারিত আদিম রূপান্তর। "
থেকে যেতে 'a'
করার Integer
, আমরা করতে হবে 1 বিস্তীর্ণ char
একটি মান int
তারপর বাক্সে int
একটি থেকে Integer
। তবে আপনি যদি অনুমতিপ্রাপ্ত রূপান্তরগুলির সংমিশ্রণগুলি দেখেন তবে আপনি বক্সিং রূপান্তরের পরে প্রসারিত প্রাথমিক রূপান্তর করতে পারবেন না।
অতএব 'a'
করতে Integer
অনুমোদিত নয়। এটি প্রথম ক্ষেত্রে সংকলন ত্রুটিটি ব্যাখ্যা করে।
তুমি ভাবছ যে 'a'
করতে Byte
অননুমোদিত কারণ যে একটি আদিম কমিয়ে আনায় রূপান্তর ... যা সব সময়ে তালিকায় না থাকে জড়িত করা হবে। আসলে, আক্ষরিক একটি বিশেষ ক্ষেত্রে। জেএলএস 5.2 নিম্নলিখিতটি বলতে যায়।
"এছাড়াও, যদি অভিব্যক্তিটি বাইট, সংক্ষিপ্ত, চর বা int এর ধরণের ধ্রুবক অভিব্যক্তি ( §15.28 ) হয়:
পরিবর্তনশীল টাইপ বাইট, সংক্ষিপ্ত, বা চর এবং ধ্রুবক প্রকাশের মান ভেরিয়েবলের ধরণের ক্ষেত্রে উপস্থাপনযোগ্য হলে একটি সংকীর্ণ আদিম রূপান্তর ব্যবহৃত হতে পারে।
যদি পরিবর্তনশীল ধরনের হয় একটি সংকীর্ণ আদিম রূপান্তর একটি বক্সিং রূপান্তর দ্বারা অনুসরণ ব্যবহার করা যেতে পারে Byte
, Short
অথবা Character
, এবং ধ্রুব মত প্রকাশের মান টাইপ বাইটে representable, সংক্ষিপ্ত, অথবা যথাক্রমে গৃহস্থালির কাজ। "
এই দ্বিতীয় ক্ষেত্রে প্রযোজ্য 'a'
করার Byte
, কারণ:
- একটি অক্ষর আক্ষরিক একটি ধ্রুবক প্রকাশ, এবং
- এর মান
'a'
হয় 97
, যার জন্য পরিসীমা মধ্যে হয়, দশমিক byte
( -128
থেকে +127
)।
এটি ব্যাখ্যা করে যে কেন দ্বিতীয় উদাহরণে কোনও সংকলনের ত্রুটি নেই।
1 - আমরা একটিতে বাক্স 'a'
করতে পারি না Character
এবং তারপরে আরও প্রশস্ত Character
করতে পারি Integer
কারণ Character
এটি জাভা সাব টাইপ নয় Integer
। উত্স টাইপ লক্ষ্য প্রকারের একটি উপ টাইপ হলে আপনি কেবলমাত্র প্রসারিত রেফারেন্স রূপান্তর ব্যবহার করতে পারেন।