回答編集履歴

4

不正確な表現を訂正

2018/01/20 19:08

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- `List<?>`って何の意味があるといえば、「要素型がObject以外のなにかの型」つまり「要素の型についてなんらかの制約があるリスト」のうち「どんな制約が付いているかが不明だけどListであることだけは分かっている」という意味合いです。
13
+ `List<?>`って何の意味があるといえば、~~「要素型がObject以外のなにかの型」つまり~~「要素の型についてなんらかの制約があるリスト」のうち「どんな制約が付いているかが不明だけどListであることだけは分かっている」という意味合いです。
14
14
 
15
15
 
16
16
 

3

表現補足

2018/01/20 19:08

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- このメソッドでは「要素の制約がなくても行える操作」ならできます。例えば要素の取り出し(A)は行えます。制約はわからなくても「絶対にObjectの派生の何かであることは確か」なので。
59
+ このメソッドでは「要素の制約が分かってなくても行える操作」ならできます。例えば要素の取り出し(A)は行えます。制約はわからなくても「絶対にObjectの派生の何かであることは確か」なので。
60
60
 
61
61
 
62
62
 

2

誤記訂正

2018/01/20 02:18

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -74,4 +74,4 @@
74
74
 
75
75
  ---
76
76
 
77
- 追記:本件は「ジェネリクスの変性」「共変、反変、非変」といったキーワードに関係が深いトピックだと思います。変性についての話はややこしく感じますが、ある程度把握しておくとジェネリクスを用いたAPIの型宣言の意味がより的確にわかってくるので調べてみることをお勧めします。
77
+ 追記:本件は「ジェネリクスの変性」「共変、反変、非変」といったキーワードに関係が深いトピックだと思います。変性についての話はややこしく感じますが、ある程度把握しておくとジェネリクスを用いたAPIの型宣言の意味がより的確にわかってくるので調べてみることをお勧めします。

1

コードを捕捉

2018/01/20 02:14

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -26,7 +26,9 @@
26
26
 
27
27
  void acceptAnyKindOfList(List<?> list) {
28
28
 
29
+ Object a = list.get(0); // (A)OK
30
+
29
- ...
31
+ list.add(追加すべき要素); // (B)NG
30
32
 
31
33
  }
32
34
 
@@ -54,21 +56,11 @@
54
56
 
55
57
 
56
58
 
57
- このメソッドでは「要素の制約がなくても行える操作」ならできます。例えば要素の取り出しは
59
+ このメソッドでは「要素の制約がなくても行える操作」ならできます。例えば要素の取り出し(A)行えます。制約はわからなくても「絶対にObjectの派生の何かであることは確か」なので。
58
60
 
59
61
 
60
62
 
61
- `Object element = list.get(0);`
62
-
63
-
64
-
65
- のように行えます。制約はわからなくても「絶対にObjectの派生の何かであることは確か」なので。
66
-
67
-
68
-
69
- 一方「要素の制約が分かっていないと行えない操作」例えば要素の追加はできません。List<String>なのかList<Integer>なのかあるいはそれ以外の何の型なのかがわからなければ「要素として格納してよい要素の型を特定できない」ためどうやっても追加はできないわけです。それを許すともはや型安全とは言えなくなります。型安全であることが静的型付け言語の命なわけですから、こういう仕様になっているのは当然と言えましょう。
70
-
71
-
63
+ 一方「要素の制約が分かっていないと行えない操作」例えば要素の追加(B)はできません。List<String>なのかList<Integer>なのかあるいはそれ以外の何の型なのかがわからなければ「要素として格納してよい要素の型を特定できない」ため`追加すべき要素`の型を表現しようがないのです。型安全であることが静的型付け言語の命なわけですから、こういう仕様になっているのは当然と言えましょう。
72
64
 
73
65
 
74
66
 
@@ -77,3 +69,9 @@
77
69
  ※: どんな型の要素でも入る
78
70
 
79
71
  厳密に言えば参照型の要素なら入るというべきかも知れません。primitive型は含まれませんので。しかしそもそもprimitive型が格納できるList(より一般的にはコレクション)は存在しませんので、本件の議論では「どんな型でも」という表現は「どんな参照型でも」というふうに考えてください。
72
+
73
+
74
+
75
+ ---
76
+
77
+ 追記:本件はは「ジェネリクスの変性」「共変、反変、非変」といったキーワードに関係が深いトピックだと思います。変性についての話はややこしく感じますが、ある程度把握しておくとジェネリクスを用いたAPIの型宣言の意味がより的確にわかってくるので調べてみることをお勧めします。