2009-08-12 3 views
1

この機能を考えるとthis question戻り値にアクセスしたときにClassCastExceptionがスローされるのはなぜですか?

に関連:

foo("hello"); 

しかし、この1は、ClassCastExceptionがスローされます。

public static <S extends CharSequence> S foo(S s) { 
    return (S) new StringBuilder(s); 
} 

なぜこの呼び出しは、例外なく実行していますか?

System.out.println(foo("hello")); 
+0

コンパイラで警告が表示されませんでしたか? –

+0

これはメソッドで警告されていますが、いずれの呼び出しでも警告されませんでした。なぜ1つの呼び出しが機能し、もう1つが例外を投げたのか不思議でした。 – Brabster

答えて

6

ジェネリック医薬品は、任意の一般的なタイプは、基本的にちょうどObjectタイプ(または任意の最小公分母の種類は、この場合CharSequenceである、である)であることを意味し、type-erasedあるメソッド内では無視されます実行時に必要な場所に適切なキャストが挿入されます。だからあなたのメソッドは、このようなものに消去されたタイプを取得:

public static CharSequence foo(CharSequence s) { 
    return (CharSequence) new StringBuilder(s); 
} 

そして、あなたの呼び出しは、これに消去されたタイプを取得:

System.out.println((String)foo("hello")); 

場合どうやらJavaは(String)キャストを挿入する気にしないだろう戻り値は決して使用されません - なぜ迷惑でしょうか?

3

汎用タイプはコンパイラでのみ使用でき、実行時には消去されます(基本的には省略されます)。だから、キャストは、Java 5/6で

関連する問題