关于泛型中的类型擦除问题

在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);
        }
    }

}

可以看出采用通配符很好的解决了由于泛型中类型擦除导致的问题

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页