Предположим, что у меня есть следующее:
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)