5

これはチェックされていないキャストだと思います(String)xが、コンパイラは警告を出しません。なぜそれが起こるのですか?

public static void main(String[] args) {
        Object x=new Object();
        String y=(String)x;
    }
4

2 に答える 2

5

(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);
于 2015-05-07T12:59:28.590 に答える
1

Java コンパイラは、ジェネリック型に対してのみ未チェックのキャスト警告を出します

于 2015-05-07T13:03:12.173 に答える