Subtyping হয় পরিবর্তিত স্থিতিমাপ ধরনের জন্য। এমনকি শক্ত শ্রেণীর Dog
একটি উপপ্রকার Animal
, পরামিতিযুক্ত ধরণের List<Dog>
একটি উপপ্রকার নয় List<Animal>
। এর বিপরীতে, covariant subtyping, অ্যারে দ্বারা ব্যবহৃত তাই অ্যারের টাইপ করা হয় Dog[]
একটি উপপ্রকার হয় Animal[]
।
ইনভেআরেন্ট সাব টাইপিং নিশ্চিত করে যে জাভা দ্বারা প্রয়োগ করা ধরণের সীমাবদ্ধতা লঙ্ঘন করা হয়নি। @ জন স্কিটির প্রদত্ত নিম্নলিখিত কোডটি বিবেচনা করুন:
List<Dog> dogs = new ArrayList<Dog>(1);
List<Animal> animals = dogs;
animals.add(new Cat()); // compile-time error
Dog dog = dogs.get(0);
@ জোন স্কিটের বক্তব্য অনুসারে, এই কোডটি অবৈধ, কারণ অন্যথায় এটি কুকুরের প্রত্যাশার সাথে বিড়াল ফিরিয়ে দেওয়ার ধরণের সীমাবদ্ধতা লঙ্ঘন করবে।
অ্যারেগুলির জন্য অনুরূপ কোডের সাথে উপরেরটির তুলনা করা শিক্ষণীয়।
Dog[] dogs = new Dog[1];
Object[] animals = dogs;
animals[0] = new Cat(); // run-time error
Dog dog = dogs[0];
কোডটি বৈধ। তবে, একটি ছোঁড়ার অ্যারে দোকান ব্যতিক্রম । একটি অ্যারে রান টাইমে এই ধরণের বহন করে এভাবে JVM কোভেরিয়েন্ট সাব টাইপিংয়ের ধরণের সুরক্ষা প্রয়োগ করতে পারে।
এটি আরও বুঝতে, আসুন javap
নীচের শ্রেণীর দ্বারা উত্পন্ন বাইটকোডটি দেখুন:
import java.util.ArrayList;
import java.util.List;
public class Demonstration {
public void normal() {
List normal = new ArrayList(1);
normal.add("lorem ipsum");
}
public void parameterized() {
List<String> parameterized = new ArrayList<>(1);
parameterized.add("lorem ipsum");
}
}
কমান্ডটি ব্যবহার করে javap -c Demonstration
এটি নিম্নলিখিত জাভা বাইটকোডটি দেখায়:
Compiled from "Demonstration.java"
public class Demonstration {
public Demonstration();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void normal();
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: iconst_1
5: invokespecial #3 // Method java/util/ArrayList."<init>":(I)V
8: astore_1
9: aload_1
10: ldc #4 // String lorem ipsum
12: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
17: pop
18: return
public void parameterized();
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: iconst_1
5: invokespecial #3 // Method java/util/ArrayList."<init>":(I)V
8: astore_1
9: aload_1
10: ldc #4 // String lorem ipsum
12: invokeinterface #5, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
17: pop
18: return
}
লক্ষ্য করুন যে পদ্ধতিগুলির সংস্থাগুলির অনুবাদিত কোডটি অভিন্ন। সংকলক প্রতিটি প্যারামিটারাইজড টাইপটিকে এর ক্ষয় দ্বারা প্রতিস্থাপন করে । এই সম্পত্তিটি গুরুত্বপূর্ণ অর্থ যে এটি পিছনে সামঞ্জস্যতা ভাঙ্গেনি।
উপসংহারে, প্যারামিটারযুক্ত ধরণের জন্য রান-টাইম সুরক্ষা সম্ভব নয়, যেহেতু সংকলক প্রতিটি প্যারামিটারাইজড টাইপটিকে তার ক্ষয় দ্বারা প্রতিস্থাপন করে। এটি প্যারামিটারাইজড প্রকারগুলি সিনট্যাকটিক চিনির চেয়ে বেশি কিছু নয়।