フォームのデータを処理するためのジェネリックメソッドを作成するときに、次のような(私が見ているように)予期しない動作に遭遇しました。次のコードが与えられます:
public class Test {
public <T> void someGenericMethod(Integer a) {
@SuppressWarnings("unchecked")
T t = (T) a;
System.out.println(t);
System.out.println(t.getClass());
}
public static void main(String[] args) {
Test test = new Test();
test.<BigDecimal>someGenericMethod(42);
}
}
AFAIK、上記のコードClassCastException
は行にaを生成する必要がありT t = (T) a
ます。これは、mainのメソッド呼び出しがパラメーター化された型を設定し、BigDecimalBigDecimal
からのキャストが許可されていないためです。予想とは逆に、プログラムは正常に実行され、次のように出力されます。Integer
42
class java.lang.Integer
実際、メソッドシグネチャに別のパラメータ(などString b
)を追加して別の割り当てを行うT t2 = (T) b
と、プログラムは次のように出力します。
42
class java.lang.String
t
変数がタイプをに変更したのはなぜですかInteger
(万が一、タイプTをオブジェクトに昇格させるためです)。
この振る舞いについての説明は大歓迎です