我在看泛型方面的东西时,遇到这样一种说法:如果类型a与类型b有继承关系,那么a[]与b[]也有继承关系。但是泛型就没有这个特点,并举例说道:
如果类型a与类型b有继承关系,那么List<a>与List<b>一毛钱关系都没有。而且假设关系成立,那么程序将出现很多错误:List<Integer> li = new ArrayList<Integer>(); 
List<Number> ln = li; // illegal 
ln.add(new Float(3.1415));这将导致li中放入Float对象。我觉得很有道理。。但是呢,问题来了,java允许这么做:List<Integer> li = new ArrayList<Integer>();
List lo = li;这个不带类型参数的List将会被擦除到类型参数的上限,就是Object,那我接下来这么做List<Integer> li = new ArrayList<Integer>();
List lo = li;
lo.add(new Float(100f);这不就和开头的情况一样了么??各位大侠 这Java语言设计得让我非常困惑。

解决方案 »

  1.   

    记住 List<Number> ln = li; // illegal  
    就行了,就是这么设计的。
      

  2.   

    这是一个编译错误!
    在java里,有一个叫做“类型擦除”的概念,你可以查一下。List<Integer> 这里只能放Integer一个类型的,如果不是,就会出现编译错误但是有一种这样的写法:
    List<? super Integer>
    List<? extends Number>其实你的想法,可以通过以下方法实现:
    List<Integer> li = new ArrayList<Integer>();
    li.add(1);
    List<? extends Number> ln = li;
    具体规则,LZ可以查阅相关资料~
      

  3.   

    恩 我就是觉得List lo = li;这句和书上说的设计理论抵触
      

  4.   

     ==。。一点都不抵触。。在运行期间。。li就是一个List 而不是 List<Integer>
      

  5.   


    这样好像也有问题
    List<Integer> li = new ArrayList<Integer>();
    li.add(1);
    List<? extends Number> ln = li;
    ln.add(new Float(100f)); // illegal