戻り値がアクセスされたときに、なぜClassCastExceptionがスローされるだけ?

StackOverflow https://stackoverflow.com/questions/1268623

  •  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(基本的に省略されます)。だから、キャストがメソッド内では無視されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top