回答編集履歴
2
説明をより具体的にしました。
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
反変や共変の例として挙げておられるメソッドの引数が全て非変になってしまってますので、反変・共変・非変がどの場合に適用されるのかを勘違いされているように見えました。Listの型引数の部分をどのように書くかでそこに書いたList型が非変/反変/共変のどれになるかが変わります。
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -30,4 +30,6 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
-
これを踏まえて共変・反変・非変について再度考えてみるとよいと思います。
|
33
|
+
これを踏まえて共変・反変・非変について再度考えてみるとよいと思います。また実際にコンパイルしてみると最初の例の引数を反変に書き直すとコンパイルエラーになりガードされる(危険なコードは書けない)ことがわかると思います。
|
34
|
+
|
35
|
+
|
1
補足追加
test
CHANGED
@@ -8,10 +8,26 @@
|
|
8
8
|
|
9
9
|
List<? super Integer> // 反変(要素の型はIntegerもしくはその基底クラス)
|
10
10
|
|
11
|
-
List<? extends
|
11
|
+
List<? extends Number> // 共変(要素の型はNumberもしくはその派生クラス)
|
12
12
|
|
13
13
|
```
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
+
この例でいえば
|
18
|
+
|
19
|
+
1. 非変に適合する型
|
20
|
+
|
21
|
+
`List<Integer>`のみ
|
22
|
+
|
23
|
+
2. 反変に適合する型
|
24
|
+
|
25
|
+
`List<Integer>`,`List<Number>`,`List<Object>`,`List<? super Number>`といったものがあります。
|
26
|
+
|
27
|
+
3. 共変に適合する型
|
28
|
+
|
29
|
+
`List<Integer>`,`List<? extends Integer>`, `List<Number>`といったものがあります。
|
30
|
+
|
31
|
+
|
32
|
+
|
17
|
-
これを踏まえて共変・反変・非変について再度考えてみ
|
33
|
+
これを踏まえて共変・反変・非変について再度考えてみるとよいと思います。
|