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

回答編集履歴

1

追記

2020/02/07 16:56

投稿

swordone
swordone

スコア20675

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`を使います。