Java Generics - Generic Method Erasure
Trình biên dịch Java thay thế các tham số kiểu trong kiểu chung bằng Đối tượng nếu các tham số kiểu không bị ràng buộc được sử dụng và với kiểu nếu tham số bị ràng buộc được sử dụng làm tham số phương thức.
Thí dụ
package com.tutorialspoint;
public class GenericsTester {
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();
integerBox.add(new Integer(10));
stringBox.add(new String("Hello World"));
printBox(integerBox);
printBox1(stringBox);
}
private static <T extends Box> void printBox(T box) {
System.out.println("Integer Value :" + box.get());
}
private static <T> void printBox1(T box) {
System.out.println("String Value :" + ((Box)box).get());
}
}
class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
}
Trong trường hợp này, trình biên dịch java sẽ thay thế T bằng lớp Đối tượng và sau khi xóa kiểu, trình biên dịch sẽ tạo bytecode cho đoạn mã sau.
package com.tutorialspoint;
public class GenericsTester {
public static void main(String[] args) {
Box integerBox = new Box();
Box stringBox = new Box();
integerBox.add(new Integer(10));
stringBox.add(new String("Hello World"));
printBox(integerBox);
printBox1(stringBox);
}
//Bounded Types Erasure
private static void printBox(Box box) {
System.out.println("Integer Value :" + box.get());
}
//Unbounded Types Erasure
private static void printBox1(Object box) {
System.out.println("String Value :" + ((Box)box).get());
}
}
class Box {
private Object t;
public void add(Object t) {
this.t = t;
}
public Object get() {
return t;
}
}
Trong cả hai trường hợp, kết quả là như nhau -
Đầu ra
Integer Value :10
String Value :Hello World