Number[] numberArray = new Integer[2];
numberArray[0] = new Double(1.5);

প্রথম লাইনে অ্যারেটা এভাবে ডিক্লেয়ার হইছে যাতে এইটা শুধু মাত্র Integer টাইপের অবজেক্টের রেফারেন্স রাখতে পারে। কিন্তু দ্বিতীয় লাইনে Double টাইপের রেফারেন্স রাখার চেষ্টা করার জন্য একটা রান টাইম ইরর পাচ্ছি।

প্রশ্ন হচ্ছে, কম্পাইল টাইমে ইরর টা পাচ্ছি না কেন?

আর প্রথম লাইনটা ভিতরে ভিতরে আসলে কিভাবে কাজ করছে? মানে যদি দ্বিতীয় লাইনটা বাদ দিয়া প্রথম লাইনটা

Number number = new Integer(2);

এভাবে লিখতাম তাহলে বুঝতাম যে সুপার টাইপের ভ্যারিয়েবল টা সাব টাইপের অবজেক্টের রেফারেন্স রাখতে পারে (Polymorphism)। কিন্তু উপরের কোডের সুপার টাইপ আর সাব টাইপ মিলায় অ্যারে ক্রিয়েট করলে আসলে ভিতরে ভিতরে কিভাবে কাজ করে?

ধন্যবাদ :)

asked 02 Dec '16, 17:50

_Shaon_'s gravatar image

_Shaon_
796220

edited 02 Dec '16, 18:05


(প্রশ্নটি খুব সুন্দর তবে অল্প কথায় উত্তর দেওয়া একটু কঠিন। তবে আমি চেষ্টা করছি, কতটুকু বুঝতে পারলে কমেন্টে অবশ্যই জানিয়ে দেবে।)

শুরুতে কয়েকটি বিষয় মনে রাখতে হবে যে, জাভাতে অ্যারে একটি অবজেক্ট। ভেরিয়েবল টাইপ এবং অবজেক্ট টাইপ কখনো কখনো আলাদা হতে পারে।

Object object = new String();

উপরের উদাহরণটিতে ভেরিয়েবল টাইপ হচ্ছে অবজেক্ট এবং অবজেক্ট টাইপ হচ্ছে স্ট্রিং। এক্ষেত্রে নিয়ম হচ্ছে যেকোনো ভেরিয়েবল টাইপের সাব-ক্লাস বসানো যায়। যেহেতু স্ট্রিং ক্লাসটি অবজেক্ট ক্লাসের সাব-টাইপ।

এর আগে কয়েকটি টার্ম শিখে নেওয়া যাক-

মনে করো দুটি ক্লাস Animal এবং Cat। এখানে, Animal সুপার-ক্লাস এবং Cat সাব-ক্লাস। তাহলে যদি কোনো অপারেশনের ফলে নিচের ঘটনাগুলো যদি হয় -

  1. Animal[] এর যায়গায় আমরা Cat[] বসাতে পারি অর্থাৎ- Animal[] animals = new Cat[5];
  2. Cat[] এর যায়গায় Animal[] বসাতে পারি অর্থাৎ- Cat[] cats = new Animal[5];

এখানে ১ নম্বর ঘটনাটিকে বলবো কোভ্যারিয়েন্স (Covariance) এবং দুই নম্বর ঘটনাটিকে বলবো কন্ট্রাভ্যারিয়েন্স (contravariance)। আর উপরের কোন ঘটনায় যদি না ঘটে তাহলে তাকে বলা হয় ইনভ্যারিয়েন্স (Invariance)।

একইভাবে -

Animal animal = new Cat(); //OK  - Covariance
Cat cat = (Cat) new Animal(); // Error  - Contravariance

জাভাতে অ্যারে কোভ্যারিয়েন্স। অর্থাৎ প্রথম ঘটনাটি সম্ভব হলেও দ্বিতীয়টি সম্ভব নয়। তাহলে -

Number[] numbers = new Number[3];
numbers[0] = new Integer(10);
numbers[1] = new Double(3.14);
numbers[2] = new Byte((byte) 0);

তাই উপরের কোডগুলো কাজ করবে। যেহেতু উপরের ১ নম্বর ঘটনা থেকে জানি, Animal এর অ্যারে Cat এর অ্যারের সাবটাইপ হতে পারে কারণ Animal সুপার-ক্লাস এবং Cat সাব-ক্লাস। সুতরাং Number যেহেতু Integer এর সুপার ক্লাস সেহেতু নিচের কোডটি বৈধ।

Integer[] myInts = {1, 2, 3, 4};
Number[] myNumber = myInts;

এখন তাহলে নিচের কোডটি খেয়াল করি -

myNumber[0] = 3.14;

এই কোডটি ঠিক মতোই কম্পাইল হবে। কারণ এখানে সাবটইপিংয়ের নিয়মের কোন সমস্যা হয় নাই। কিন্তু রানটাইম ArrayStoreException থ্রু করবে।

প্রশ্ন হচ্ছে এটি কেনো কম্পাইলটাইমে ধরা পরলো না। কারণ কম্পাইলটাইমে আমরা কম্পাইলারকে বোকা বানিয়েছি। জাভা অ্যারে যেহেতু কন্ট্রাভ্যারিয়েন্স সাপোর্ট করে না, এবং রানটাইমে myNumber[0] তে কী বসতে পারে তার তথ্য JVM এর কাছে রয়েছে, তাই এটি রান টাইমে ধরা পরে।

যদিও অামরা অ্যারের ভেরিয়েবলকে Number ক্লাস দিয়ে অ্যাকসেস করার চেষ্টা করছি, কিন্তু রানটাইমে এটি কিন্তু আর Number নেই, বরং এটি একটি Integer। আর ইন্টিাজরে ডাবল বসানোর উপায় নেই। কারণ ইন্টিজার মোটেও ডাবলের সুপার টাইপ নয়।

permanent link

answered 03 Dec '16, 20:44

bazlur_rahman's gravatar image

bazlur_rahman
1.3k17

edited 03 Dec '16, 20:53

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×210
×70
×2
×1

question asked: 02 Dec '16, 17:50

question was seen: 659 times

last updated: 03 Dec '16, 20:53