Java泛型與集合筆記——子類型與通配符
不定期更新,無廢話開始:- List<Integer>不是List<Number>的子類,但List<Integer>是Collection<Integer>的子類。
- 一個List<? extends Number>的對象引用可以被賦值任何以Number或其子類為泛型的List或其子類的對象實例引用,如下例1 List<? extends Number> nums = new ArrayList<Integer>();
- 泛型方法可以顯示指定其返回結果的泛型類型,如下例1 Arrays.<Object>asList(1, 1.2, "Hello");
2 Collections.<Number>copy(objs, ints); - Get與Put原則:當僅從結構中取出值則使用extends通配符,當僅向結構中添加值則使用super通配符,當對一個結構即取出又添加值時不要使用任何通配符。1 //Collections.copy方法即使用super又使用extends的例子
2 public static <T> void copy(List<? super T> dest, List<? extends T> src)1 //另一個例子,對同一個結構即取值又設值,不使用任何通配符
2 public static double sum(Collection<? extends Number> nums) {
3 double s = 0.0;
4 for (Number num : nums) s += num.doubleValue();
5 return s;
6 }
7
8 public static void count(Collection<? super Integer> ints, int n) {
9 for (int i = 0; i < n; i++) ints.add(i);
10 }
11
12 //注意這個方法參數的簽名,沒有使用任何通配符
13 public static double sumCount(Collection<Number> nums, int n) {
14 count(nums, n);
15 return sum(nums);
16 }
posted @ 2016-05-25 10:10 Eric Song 閱讀(268) | 評論 (0) | 編輯 收藏