は、次のコードがあると仮定:リフレクションキャストが例外をスローする間に暗黙のキャストが機能するのはなぜですか?
@SuppressWarnings("unchecked")
public static <T> T implicitCaster(Class<T> cls, Object o) {
return (T) o;
}
public static <T> T reflectionCaster(Class<T> cls, Object o) {
return cls.cast(o);
}
プリミティブに見出される、以下の例外を除いて、両方の場合に予想されるようにコードが動作
:
public static void main(String[] args) {
System.out.println(implicitCaster(int.class, 42));
System.out.println(reflectionCaster(int.class, 42));
}
最初の呼び出しが期待どおりに動作しますが、第2の呼java.lang.ClassCastException
をスローします。
オートボクシングを無視したコーナーケースですか?あるいは、反射鋳造の自動ボクシングを提供することは不可能ですか? また、この不一致を引き起こす原因が他にもありますか?
編集:このコードを呼び出すと、期待通りに動作します:
public static void main(String[] args) {
System.out.println(implicitCaster(Integer.class, 42));
System.out.println(reflectionCaster(Integer.class, 42));
}
私は、コードはプリミティブを除いてすべての与えられたクラスで動作すると書いています。オブジェクトをジェネリック型にキャストすることは可能です。次に、オブジェクトをプリミティブにキャストできます。 – m3th0dman
@ m3th0dman:私はそれが不可能だと言っていませんでした。私はそれが実行時に効果がないと言いました。 – SLaks
私は今理解しています。しかし、この種の鋳造法の契約を破ることはありませんか?技術的にはキャストが可能です。 – m3th0dman