2.2 Wildcards with extends
前面介绍过List<Integer>
不是List<Number>
的子类,即前者不能替换后者,
? 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 { Listints = new ArrayList<>(); ints.add(3); ints.add(4);// List 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 { Listints = new ArrayList<>(); ints.add(1); ints.add(12); List 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是不能编译通过的。 好了。 加油,我要做技术专家。