在JAVA中,我们会经常用到List<..>,其中<>中的即为泛型,在这里我想说明的是泛型从存在的类型擦除所导致的一些常见问题
贴上测试代码:
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
List<Integer> myInts=new ArrayList<Integer>();
myInts.add(1);
myInts.add(2);
List<Number> mynums=myInts;
}
}
结果如下
我们通常会认为由于Integer是Number的子类型,故有List<Integer>是List<Number>的子类型,但很疑惑为什么这个程序会在静态类型检查的时候报错。实际上这是由于泛型所存在的类型擦除机制,在编译时,编译器并不会将泛型具体,而是将其中的类型进行擦除。但如果用通配符却能够解决这个问题,在泛型中任何类型数据都是通配符类型的子类,我们可以认为其有父子关系
代码如下:
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
List<Integer> myInts=new ArrayList<Integer>();
myInts.add(1);
myInts.add(2);
List<? extends Number> mynums=myInts;
for(Number n:mynums)
{
System.out.println(n);
}
}
}
可以看出采用通配符很好的解决了由于泛型中类型擦除导致的问题