不输入任何参数吗?

时间:2016-07-18 10:44:20

标签: 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;
    }
}

在main中,我通过传递一个类型参数Parcel来调用方法。但它仍然打印100.

public static void main(String args[]) {
    Parcel<String> parcel = new Parcel<>();
    System.out.println(parcel.<Parcel> deliver());
}

这是因为在打印行中传递的类型参数Parcel没有扮演任何角色,我在这里预期会有例外。它是如何工作的?

1 个答案:

答案 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