回答編集履歴

1

追記

2020/02/07 16:56

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -8,4 +8,42 @@
8
8
 
9
9
  それで正解です。これはコンパイルエラーではなく「警告」で、このままでも実行は可能です。
10
10
 
11
+
12
+
11
- この警告については後ほど追記します。
13
+ この警告が出る理由は次のようなります。
14
+
15
+ Listは、List<String>だろうがList<Integer>だろうが、実体としてはどちらも同じです。
16
+
17
+ ジェネリクスの部分は実体としてはObjectと同じになります。
18
+
19
+ getで取得する場合は、Objectからジェネリクスで定められた型にキャストしています。
20
+
21
+ つまり、Listの実際の動作イメージとしては次のようになります。
22
+
23
+ ```java
24
+
25
+ //List.class
26
+
27
+
28
+
29
+ //Object[] element;
30
+
31
+ //このTの部分が、List<String>の場合はStringに、List<Integer>の場合はIntegerになる
32
+
33
+ public T get(int index) {
34
+
35
+ return (T)element[index];
36
+
37
+ }
38
+
39
+ ```
40
+
41
+
42
+
43
+ いま、Object型のものをListにキャストできたとします。しかし、その内部の要素がStringであるかどうかまではチェックできません。
44
+
45
+ それがListであることが確認できたとしても、List<String>とList<Integer>では実体に差が無いため、区別できません。List<String>にキャストして、そのキャストが「本当に安全か」、つまりgetをしても問題ないかは実行してみるまでわからないということになります。これが「未検査キャスト」の意味です。
46
+
47
+
48
+
49
+ 警告を消したい場合は、アノテーション`@SuppressWarnings`を使います。