В прошлый четверг кто-то на работе показал мне ошибку компиляции, которую я не смог исправить чисто, и с тех пор меня беспокоит.
Проблема связана с дженериками, и я восстановил упрощенную версию кода, который генерирует ошибку компиляции. Ошибка возникает в самой последней строке кода, показанной ниже.
Я просмотрел всю сеть, но, похоже, не нашел достойного объяснения, почему компилятор Java не принимает код. Я предполагаю, что если бы был разрешен код, было бы возможно создать проблему с приведением класса в Bar.operationOnBar (), но я не понимаю, как это сделать.
Не мог бы кто-нибудь объяснить мне, почему это не компилируется?
public interface Interface {
}
public class Type implements Interface {
}
public class Bar<T> {
public Bar(Class<T> clazz) {
}
public void operationOnBar(Class<T> arg){
}
}
public class Foo {
public <T> Bar<T> bar(Class<T> clazz){
return new Bar<T>(clazz);
}
public static void main(String[] args) {
Class<? extends Interface> extendsInterfaceClazz = Type.class;
new Foo().bar(extendsInterfaceClazz).operationOnBar(Type.class);
}
}
Ошибка компиляции во второй строке Foo.main ():
The method operationOnBar(Class<capture#1-of ? extends Interface>) in the type Bar<capture#1-of ? extends Interface> is not applicable for the arguments (Class<Type>)
Кстати. Я решил это, понижая Type.class до Class, таким образом компилятор не может увидеть, что общий тип Class - это «Type» вместо «? Extends Interface».