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

回答編集履歴

1

コードで明示

2018/04/21 01:57

投稿

maisumakun
maisumakun

スコア146702

answer CHANGED
@@ -4,6 +4,15 @@
4
4
 
5
5
  `List<?>`では、このリストに`add`する操作を書こうとすれば、型が決まらないのでコンパイルエラーに**なってくれます**。原型の`List`には`add`も成功してしまい、**宣言した型と違う要素を入れられる**という形で型安全性が破綻します。ということで、原型の値を扱うべき場面はありません。
6
6
 
7
+ ```java
8
+ List<String> someList = new ArrayList<String>();
9
+ List<?> wildList = someList;
10
+ wildList.add(new Object()); // コンパイルエラーになる
11
+
12
+ List rawList = someList;
13
+ rawList.add(new Object()); // できてしまう
14
+ ```
15
+
7
16
  例外が2つほどありまして、
8
17
 
9
18
  * `Class`オブジェクトを取得したい場合は、原型を使って`List.class`のように書く必要があります。`List<Object>.class`や`List<?>.class`は動きません。