teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

説明をより具体的にしました。

2016/10/01 13:45

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,4 +1,4 @@
1
- 根本的なころを見落としておられます。JavaのListのでいうと
1
+ 反変や共変の例として挙げておられるメソッドの引数が全て非変になってしってますので、反変・共変・非変がどの場合に適用されるのかを勘違いされているように見えました。Listの型引数の部分をどのように書くかそこに書たList型が非変/反変/共変のどれになるかが変わります。
2
2
 
3
3
  ```java
4
4
  List<Integer> // 非変(要素の型はIntegerと一致しなければならない)
@@ -14,4 +14,4 @@
14
14
  3. 共変に適合する型
15
15
  `List<Integer>`,`List<? extends Integer>`, `List<Number>`といったものがあります。
16
16
 
17
- これを踏まえて共変・反変・非変について再度考えてみるとよいと思います。
17
+ これを踏まえて共変・反変・非変について再度考えてみるとよいと思います。また実際にコンパイルしてみると最初の例の引数を反変に書き直すとコンパイルエラーになりガードされる(危険なコードは書けない)ことがわかると思います。

1

補足追加

2016/10/01 13:44

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -3,7 +3,15 @@
3
3
  ```java
4
4
  List<Integer> // 非変(要素の型はIntegerと一致しなければならない)
5
5
  List<? super Integer> // 反変(要素の型はIntegerもしくはその基底クラス)
6
- List<? extends Integer> // 共変(要素の型はIntegerもしくはその派生クラス)
6
+ List<? extends Number> // 共変(要素の型はNumberもしくはその派生クラス)
7
7
  ```
8
8
 
9
+ この例でいえば
10
+ 1. 非変に適合する型
11
+ `List<Integer>`のみ
12
+ 2. 反変に適合する型
13
+ `List<Integer>`,`List<Number>`,`List<Object>`,`List<? super Number>`といったものがあります。
14
+ 3. 共変に適合する型
15
+ `List<Integer>`,`List<? extends Integer>`, `List<Number>`といったものがあります。
16
+
9
- これを踏まえて共変・反変・非変について再度考えてみてください。
17
+ これを踏まえて共変・反変・非変について再度考えてみるとよと思います