假设我有一个通用类Parcel和一个通用方法,如下面的代码所示.该方法打印并返回x,该方法在方法内分配了一个类型参数Integer.
public class Parcel<T> {
public <X> X deliver(){
X x = (X) new Integer(100);
System.out.println(x);
return x;
}
}
Run Code Online (Sandbox Code Playgroud)
在main中,我通过传递一个类型参数Parcel来调用方法.但它仍然打印100.
public static void main(String args[]) {
Parcel<String> parcel = new Parcel<>();
System.out.println(parcel.<Parcel> deliver());
}
Run Code Online (Sandbox Code Playgroud)
接下来,在打印行中传递的类型参数Parcel不起任何作用,我在此预期会有异常.它是如何工作的 ?
您观察到的现象称为类型擦除。编译器使用通用参数来确保类型正确性,并且不会出现在运行时中。
一般来说,没有什么可以阻止你做这个技巧:
List<Integer> list = new ArrayList<>();
list.append(""); // produces compiler error
// just drop that "useless" generic argument
List erased = (List) list;
erased.append(""); // works fine
Run Code Online (Sandbox Code Playgroud)
编辑
实际上我最初的答案有时是为了这个Parcel实现
public class Parcel<T> {
public T deliver(){
T x = (T) new Integer(100);
System.out.println(x);
return x;
}
}
Run Code Online (Sandbox Code Playgroud)
但关键思想是相同的<X> X deliver():
Object parcel = parcel.<Parcel> deliver(); // erased, works ok
Parcel parcel = parcel.<Parcel> deliver(); // java.lang.ClassCastException
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |