何とか別のクラスB
または他の1にマッピングすることができるクラスA
があります:返される関数に追加のキャストが必要な理由(互換性のない型)?
class A {}
class B {
final A a;
B(A a) {
this.a = a;
}
}
引数として渡された第二のクラスタイプに基づいて、別のクラスにA
からマッパーを返すマッパーの工場もあります。
class Mapper {
static Function<A, B> a2bmapper = B::new;
static <R> Function<A, R> findMapper(Class<R> cls) {
if(cls == B.class) {
return a2bmapper;
}
return null;
}
}
問題は、この行に:
return a2bmapper;
Javaコンパイラで互換性のないタイプが発生する:必須R、Found BとIDEがキャストすると、Function<A,R>
になります。何故ですか? R
は汎用タイプに過ぎず、B
に置き換えてください。
簡単な答えは、型システムが多くをチェックすることができますが、_everything_をチェックすることはできません。言語仕様とコンパイラに組み込まれた時間と労力の点で、理論的で実用的な制限が作用します。この場合、Javaは、cls == B.class、R == B以降の推移計算を行いません。 – yshavit