java的泛型是个有趣的东西

因为泛型的擦除(erasure),任何在运行时需要知道确切类型信息的操作都将无法工作。

public class Erased<T> {
    private final int SIZE = 100;
    public static void f(Object arg){
        if (arg instanceof T){}        // error
        T var = new T();                  // error
        T[] array = new T[SIZE];    //  error
        T[] array = (T[])new Object[SIZE]; // unchecked warning
    }
}

请看上述代码,"arg instanceof T",编译器会认为写这段程序的人是想检查arg是否为某一个类。但是erasure导致这个人的愿望落空,所以就把这段语句置为error。


编译器发现这段代码时“T[] array = new T[SIZE]”,它不知道到底要创建一个什么类型的数组,它没有选择把这段代码编译成创建Object数组,也许有它的理由,但是我不知道为什么。也许它认为这不符合编写这段程序的人的愿望。


编译器发现这段代码“T[] array = (T[])new Object[SIZE]",它认为这可以通过error检查,但是这里有个警告,会有隐藏的问题。然后它把这段代码编译成了Object[] array = new Object[SIZE]。


你可能感兴趣的:(java,泛型,generic,擦除,erasure)