Foo.class.cast(o)
と書く理由はまったくありません(Foo)o
。
一般に、 が具体化可能な型 である場合X
、、 thenClass<X> clazz
はclazz.cast(o)
と同じ(X)o
です。
したがって、すべての型が具体化可能である場合、メソッドClass.cast()
は冗長で役に立ちません。
残念ながら、現在のバージョンの Java では消去が行われるため、すべての型が再定義できるわけではありません。たとえば、型変数は具体化できません。
T
が型変数の場合、キャストは(T)o
チェックされません。これは、実行時に の正確な型がT
JVM に認識されないためです。JVM は、o
が本当に typeかどうかをテストできませんT
。キャストが誤って許可される可能性があり、後で問題が発生する可能性があります。
これは大きな問題ではありません。通常、プログラマーが(T)o
. キャストはアプリ ロジックによってチェックされます。
キャストの時点でa が利用可能であると仮定すると、実行時にClass<T> clazz
何があるかがわかります。T
ランタイム チェックを追加してo
、実際にT
.
check clazz.isInstance(o);
(T)o;
そして、これは本質的に何をするかClass.cast()
です。
どのような場合でもキャストが失敗することは想定していません。したがって、正しく実装されたアプリでは、チェックclazz.isInstance(o)
は常に成功する必要があります。したがって、コードが正しいという前提の下で -clazz.cast(o)
と同等です。(T)o
コードが正しく、キャストが安全であることを証明できる場合は、パフォーマンス上の理由(T)o
から好む可能性があります。clazz.cast(o)
別の回答で発生した例ではMutableClassToInstanceMap
、キャストが安全であることは明らかであるため、シンプル(T)o
で十分でした。