自己参照ジェネリック パラメータと同じスーパー クラスのパラメータを持つクラスがあります。static 関数には、クラスと同じ境界があります。
public class Bar<T extends Bar<T, C>, C extends Bar<C, ?>> {
Bar() {
foo((T) null);
foo((C) null);//compile error
}
static <S_T extends Bar<S_T, S_C>, S_C extends Bar<S_C, ?>> void foo(S_T t) {
}
}
これにより、次のエラーが発生します。
範囲の不一致: Bar<T,C> 型のジェネリック メソッド foo(S_T) は、引数 (C) には適用できません。推定された型 C は、境界付きパラメーター <S_T extends Bar<S_T,S_C>> の有効な代替ではありません
isとワイルドカードが a であるため、渡せC
ない理由がわかりません。これは、宣言の 2 番目のパラメーターが Bar を拡張すると述べているためです。foo()
C
Bar<C,?>
Bar
これはおそらく悪い考えであり、理解しにくいコードを生成することはわかっていますが、なぜこれがコンパイルされないのかを本当に知りたいです。