私が次のものを持っているとしましょう:
public <T extends Widget> List<T> first(T n) {
return first(n.getClass());
}
public <T extends Widget> List<T> first(Class<T> n) {
return new ArrayList<>();
}
コンパイラは 3 行目で " incompatible types; required: java.util.List<T>; found: java.util.List<capture#1 of ? extends my.app.Widget>
" でエラーを出します。理由がわかりません。T
サブタイプ以外のいずれの場合でも、タイプが決して変更されないことは私には理にかなっているように思えます。
これは、明示的なキャストによって修正できますが、なぜ必要なのかはわかりません。
public <T extends Widget> List<T> first(T n) {
return (List<T>)first(n.getClass());
}
public <T extends Widget> List<T> first(Class<T> n) {
return new ArrayList<>();
}
これはコンパイラのバグでしょうか?
JDK 1.7.0_15 を使用していることに注意してください。
java version "1.7.0_15"
Java(TM) SE Runtime Environment (build 1.7.0_15-b03)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)