これはチェックされていないキャストだと思います(String)x
が、コンパイラは警告を出しません。なぜそれが起こるのですか?
public static void main(String[] args) {
Object x=new Object();
String y=(String)x;
}
これはチェックされていないキャストだと思います(String)x
が、コンパイラは警告を出しません。なぜそれが起こるのですか?
public static void main(String[] args) {
Object x=new Object();
String y=(String)x;
}
(String)x
未チェックのキャストだと思う
いいえ、ちがいます。実行時にチェックされます。キャストが有効でない場合は、例外がスローされます。
チェックされていないキャストは、チェックを行うように見えるキャストに関するものですが、実際には、型消去のために期待するすべてをチェックしていません。例えば:
List<String> strings = new ArrayList<>();
Object mystery = strings;
List<Integer> integers = (List<Integer>) mystery;
integers.add(0); // Works
String x = strings.get(0); // Bang! Implicit cast fails
(List<Integer>) mystery
ここで、オブジェクトmystery
が参照するチェックのみのキャストは a List
- not aList<Integer>
です。実行時に a などの概念がないため、このInteger
部分はチェックされません。List<Integer>
したがって、この例では、そのキャストは「実際の」チェックでは成功しない場所で成功します。add
呼び出しは正常に機能Object[]
しInteger
ます。get()
への呼び出しが暗黙的にキャストを実行するため、最後の行は失敗します。
VMに関する限り、サンプルコードは事実上次のとおりです。
List strings = new ArrayList();
Object mystery = strings;
List integers = (List) mystery;
integers.add(0);
String x = (String) strings.get(0);
Java コンパイラは、ジェネリック型に対してのみ未チェックのキャスト警告を出します