假设我有一个通用类Parcel和一个通用方法,如下面的代码所示。该方法打印并返回x,该方法在方法内分配了一个类型参数Integer。
public class Parcel<T> {
public <X> X deliver(){
X x = (X) new Integer(100);
System.out.println(x);
return x;
}
}
在main中,我通过传递一个类型参数Parcel来调用方法。但它仍然打印100.
public static void main(String args[]) {
Parcel<String> parcel = new Parcel<>();
System.out.println(parcel.<Parcel> deliver());
}
这是因为在打印行中传递的类型参数Parcel没有扮演任何角色,我在这里预期会有例外。它是如何工作的?
答案 0 :(得分:1)
您观察到的内容称为type erasure。编译器使用通用参数来确保类型正确性,并且在运行时不存在。
一般来说,没有什么能阻止你做这个伎俩:
List<Integer> list = new ArrayList<>();
list.append(""); // produces compiler error
// just drop that "useless" generic argument
List erased = (List) list;
erased.append(""); // works fine
修改强>
实际上我的原始答案偶尔是针对此Parcel
实施
public class Parcel<T> {
public T deliver(){
T x = (T) new Integer(100);
System.out.println(x);
return x;
}
}
但<X> X deliver()
的关键思路是相同的:
Object parcel = parcel.<Parcel> deliver(); // erased, works ok
Parcel parcel = parcel.<Parcel> deliver(); // java.lang.ClassCastException