これらのステートメントは同一ではありません。キャスト メソッドは通常のメソッド呼び出し ( invokevirtual
JVM 命令) であり、もう 1 つは言語構造 (checkcast
命令) です。上記の場合、2 番目の形式を使用する必要があります。(TrTuDocPackTypeDto) packDto
このcast
メソッドは、変数型の Class インスタンスがある場合に、ジェネリックを使用したリフレクション プログラミングで使用されます。次のように使用できます。
public <T> Set<T> find(Class<T> clz, Filter criteria) {
List<?> raw = session.find(clz, criteria); /* A legacy, un-generic API. */
Set<T> safe = new HashSet<T>();
for (Object o : raw)
safe.add(clz.cast(o));
return safe;
}
これにより、生の型をジェネリック型に単純にキャストするという誤った代替手段を回避する安全な方法が得られます。
/* DO NOT DO THIS! */
List raw = new ArrayList();
...
return (List<Widget>) raw;
コンパイラは警告を表示します。Unchecked cast from List to List<Widget>
つまり、省略記号では、誰かが生のリストに a を追加した可能性があり、呼び出し元が返された (想定される)インスタンスのリストを反復処理するGadget
と、最終的に a が発生します。ClassCastException
Widget