Java Generics:在泛型类中键入其他字段的擦除

Mag*_*aug 8 java generics type-erasure

如果我编译下面的代码javac Test.java -Xlint:unchecked,c4由于类型擦除,对变量的赋值会产生警告.这里的类型是微不足道的,只是例子.

为什么对象引用g3会丢失有关成员变量的类型信息Comparator<String> strCmp?为什么不c1发出相同的警告,唯一的区别是该类不是通用的?

import java.util.Comparator;

public class Test {

    NormalClass n = new NormalClass();
    Comparator<String> c1 = n.strCmp;

    GenericClass<Long> g1 = new GenericClass<Long>();
    Comparator<String> c2 = g1.strCmp;

    GenericClass<?> g2 = new GenericClass<Long>();
    Comparator<String> c3 = g2.strCmp;

    GenericClass g3 = new GenericClass<Long>();
    Comparator<String> c4 = g3.strCmp;
}

class NormalClass {
    public Object t;
    public Comparator<String> strCmp;
}

class GenericClass<T> {
    public T t;
    public Comparator<String> strCmp;
}
Run Code Online (Sandbox Code Playgroud)