Java Generics and Collections-2.2

时间:2023-03-08 17:57:23

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是不能编译通过的。

好了。

加油,我要做技术专家。