戻り値がアクセスされたときに、なぜClassCastExceptionがスローされるだけ?
-
13-09-2019 - |
質問
タグにこの質問をhref="https://stackoverflow.com/questions/1268533/why-is-this-generic-method-unsafe"> この機能が与えられます:
public static <S extends CharSequence> S foo(S s) {
return (S) new StringBuilder(s);
}
なぜ、この呼び出しが例外なく実行しない:
foo("hello");
しかし、この1つはClassCastExceptionがスロー?
System.out.println(foo("hello"));
解決
Javaの5/6で
ジェネリック医薬品は、型消去されています、任意の一般的なタイプは、実行時に基本的にだけObject
型(または任意の最小公倍数タイプはこの場合CharSequence
である、である)であることを意味します。必要な場所に適切なキャストが挿入されています。だからあなたのメソッドは、型消去され、このようなものになります:
public static CharSequence foo(CharSequence s) {
return (CharSequence) new StringBuilder(s);
}
そして、あなたの呼び出しは、これに消去されたタイプを取得ます:
System.out.println((String)foo("hello"));
どうやらJavaは(String)
キャストを挿入する気にしないだろう、戻り値を使用していない、なぜ決してされた場合にわざわざ?
他のヒント
一般的なタイプは、コンパイラに対してのみ利用可能であり、実行時にerasured(基本的に省略されます)。だから、キャストがメソッド内では無視されます。
所属していません StackOverflow