回答編集履歴
1
追記
answer
CHANGED
@@ -3,4 +3,23 @@
|
|
3
3
|
List<String> list = (List<String>) obj.get("list");
|
4
4
|
|
5
5
|
それで正解です。これはコンパイルエラーではなく「警告」で、このままでも実行は可能です。
|
6
|
+
|
6
|
-
この警告
|
7
|
+
この警告が出る理由は次のようになります。
|
8
|
+
Listは、List<String>だろうがList<Integer>だろうが、実体としてはどちらも同じです。
|
9
|
+
ジェネリクスの部分は実体としてはObjectと同じになります。
|
10
|
+
getで取得する場合は、Objectからジェネリクスで定められた型にキャストしています。
|
11
|
+
つまり、Listの実際の動作イメージとしては次のようになります。
|
12
|
+
```java
|
13
|
+
//List.class
|
14
|
+
|
15
|
+
//Object[] element;
|
16
|
+
//このTの部分が、List<String>の場合はStringに、List<Integer>の場合はIntegerになる
|
17
|
+
public T get(int index) {
|
18
|
+
return (T)element[index];
|
19
|
+
}
|
20
|
+
```
|
21
|
+
|
22
|
+
いま、Object型のものをListにキャストできたとします。しかし、その内部の要素がStringであるかどうかまではチェックできません。
|
23
|
+
それがListであることが確認できたとしても、List<String>とList<Integer>では実体に差が無いため、区別できません。List<String>にキャストして、そのキャストが「本当に安全か」、つまりgetをしても問題ないかは実行してみるまでわからないということになります。これが「未検査キャスト」の意味です。
|
24
|
+
|
25
|
+
警告を消したい場合は、アノテーション`@SuppressWarnings`を使います。
|