Java Generics and Collections-2.2

2.2 Wildcards with extends

前面介绍过List<Integer>不是List<Number>的子类,即前者不能替换后者,
java使用? extends [classname]语法,即List<Integer>
可以替换 List<? extends 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<>();
        ints.add(3);
        ints.add(4);
//        List<Number> nums = ints;//compile error
//        nums.add()
    }
}

这是上一节介绍的内容,即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/22.
 */
public class Test_2_2 {
    @Test
    public void test_01() throws Exception {
        List<Integer> ints = new ArrayList<>();
        ints.add(1);
        ints.add(12);
        List<? extends Number> nums = ints;//compile pass
//        nums.add(2.3);//compile error
    }
}

可以看出List<Integer> 可以替换
List<? extends Number>
但是nums.add(2.3)是不允许的,还是那个原因,nums调用的实际是ints的add()方法(多态),
add(Integer i),因此,此处放一个double是不能编译通过的。
好了。

加油,我要做技术专家。

原文地址:https://www.cnblogs.com/xiaojintao/p/5306086.html