মাইকেল বেরির দেওয়া উত্তরটি বিশদভাবে বর্ণনা করা।
Dog d = (Dog)Animal; //Compiles but fails at runtime
এখানে আপনি সংকলককে বলছেন "আমাকে বিশ্বাস করুন। আমি জানি d
সত্যিকার অর্থে কোনও Dog
বস্তুর উল্লেখ করা হচ্ছে " যদিও তা না।
মনে রাখবেন সঙ্কলনকারী যখন আমরা একটি ডাউনকাস্ট করি তখন আমাদের বিশ্বাস করতে বাধ্য হয় ।
সংকলক কেবল ঘোষিত রেফারেন্স প্রকারের সম্পর্কেই জানে। রানটাইমের সময়ে জেভিএম জানে যে বস্তুটি আসলে what
সুতরাং যখন রানটাইমে জেভিএম পরিসংখ্যান করে যে Dog d
প্রকৃতপক্ষে Animal
কোনও Dog
বস্তুর উল্লেখ করছে যা এটি বলে না। আরে ... আপনি কম্পাইলারের কাছে মিথ্যা বলেছেন এবং একটি বড় ফ্যাট নিক্ষেপ করেছেন ClassCastException
।
সুতরাং আপনি যদি ডাউন কাস্টিং instanceof
হন তবে স্ক্রু আপ এড়াতে আপনার পরীক্ষা করা উচিত ।
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
}
এখন আমাদের মনে একটি প্রশ্ন আসে। নরক সংকলক কেন অবশেষে এটি নিক্ষেপ করতে চলেছে হতাশাকে অনুমতি দিচ্ছেjava.lang.ClassCastException
?
উত্তরটি যে সমস্ত সংকলক করতে পারে তা যাচাই করা হয় যে দুটি animal
প্রকারটি একই উত্তরাধিকার গাছে রয়েছে, সুতরাং ডাউন কোডের আগে যে কোনও কোড আসতে পারে তার উপর নির্ভর করে এটি টাইপ হওয়ার সম্ভাবনা রয়েছে dog
।
সংকলকটিকে অবশ্যই এমন জিনিসগুলিকে মঞ্জুরি দিতে হবে যা রানটাইমের সময় সম্ভব কাজ করে।
নিম্নলিখিত কোড স্নিপেট বিবেচনা করুন:
public static void main(String[] args)
{
Dog d = getMeAnAnimal();// ERROR: Type mismatch: cannot convert Animal to Dog
Dog d = (Dog)getMeAnAnimal(); // Downcast works fine. No ClassCastException :)
d.eat();
}
private static Animal getMeAnAnimal()
{
Animal animal = new Dog();
return animal;
}
তবে, সংকলকটি যদি নিশ্চিত হন যে castালাই কাজ করতে পারবেন না, সংকলন ব্যর্থ হবে। IE যদি আপনি বিভিন্ন উত্তরাধিকারের শ্রেণিবিন্যাসে বস্তুগুলি কাস্ট করার চেষ্টা করেন
String s = (String)d; // ERROR : cannot cast for Dog to String
ডাউনকাস্টিংয়ের বিপরীতে, উজানবিশেষ সুস্পষ্টভাবে কাজ করে কারণ আপনি যখন আপকেনশন করেন তখন আপনি সংক্ষিপ্তভাবে আপনি যে পদ্ধতিতে প্রার্থনা করতে পারবেন তা সীমাবদ্ধ করে দিচ্ছেন, ডাউনকাস্টিংয়ের বিপরীতে, যা পরবর্তীকালে ইঙ্গিত দেয় যে আপনি আরও নির্দিষ্ট কোনও পদ্ধতিতে প্রার্থনা করতে চাইতে পারেন।
Dog d = new Dog();
Animal animal1 = d; // Works fine with no explicit cast
Animal animal2 = (Animal) d; // Works fine with n explicit cast
উপরের উজানগুলি উভয়ই ব্যতিক্রম ছাড়াই দুর্দান্ত কাজ করবে কারণ একটি কুকুর আইএস-এ অ্যানিমাল, অ্যানিথিং অ্যানিমেল করতে পারে, একটি কুকুরও করতে পারে। তবে এটি সত্য ভাসা-বিপরীত নয়।