Java Generics and Collections-2.1

2.1 子类化以及替换原理

为什么List<Integer> 不是List<Number> 的子类?

首先看下面的代码,这段代码是编译不过的
package java_generics_collections.chap2;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by jintaox on 2016/3/21.
 */
public class Test_2_1 {
    @Test
    public void test_01() throws Exception {
        List<Integer> ints = new ArrayList<>();  //a
        ints.add(3);//b
        ints.add(4);//c
        List<Number> nums = ints;//d
        nums.add(new Double(3.14));//e
    }
}

假如,List 是List的子类型,首先List 中的add方法接受一个T类型的变量,因此,它们分别接受Integer和Number
当代码运行到d处时不会编译不过,那么当运行到e处时,因为ints的add方法接受一个Integer,而nums的add方法接受一个Number类型,
由于多态,当调用nums.add()时,实际调用为子类的add方法,那么其接受为Integer型,而给出的确实Double型,而Integer和Double是不能互换的。也就是说,根据Java的泛型规范,这样是不可以的。
因此,对于Son extends Father的情况,List<Son>不是List<Father>的子类,把它们认为是不想关的好了。

posted @ 2016-03-21 19:49  JintaoXIAO  阅读(153)  评论(0编辑  收藏  举报