不输入参数扮演任何角色?

Nan*_*neV 5 java generics

假设我有一个通用类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不起任何作用,我在此预期会有异常.它是如何工作的 ?

vsm*_*kov 1

您观察到的现象称为类型擦除。编译器使用通用参数来确保类型正确性,并且不会出现在运行时中。

一般来说,没有什么可以阻止你做这个技巧:

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)