当把一个带有泛型信息的变量赋值给一个不带泛型信息的变量时,泛型信息将被擦除,对元素的类型参数检查将变成类型的上限。
class Apple<T extends Number>{ T size; public Apple(){ } public T getSize() { return size; } public void setSize(T size) { this.size = size; } } public class ErasureTest { public static void main(String[] args) { Apple<Integer> ap=new Apple<>(); Integer apSize=ap.getSize(); Apple ap2=ap; //Type mismatch: cannot convert from Number to Integer //Integer apSize2=ap2.getSize(); } }
理论上,List<string>是List的子类,把List对象直接赋给List<string>应该出现编译错误,但实际上不会。</string></string>
public class ErasureTest2 { public static void main(String[] args) { List<Integer> li = new ArrayList<>(); li.add(1); // 泛型擦除 List list = li; System.out.println(li.get(0)); // 警告:The expression of type List needs unchecked conversion to conform // to List<String> ls = list; // Exception :java.lang.Integer cannot be cast to java.lang.String System.out.println(ls.get(0)); } }