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是不能编译通过的。
好了。
加油,我要做技术专家。