В прошлый четверг кто-то на работе показал мне ошибку компиляции, которую я не смог исправить, и с тех пор это беспокоит меня.
Проблема связана с генериками, и я восстановил упрощенную версию кода, которая выдает ошибку компиляции. Ошибка возникает в самой последней строке кода, показанной ниже.
Я просматривал все сети, но не могу найти достойного объяснения, почему компилятор 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>)
Btw. Я решил это путем перевода Type.class в Class, таким образом компилятор не может увидеть, что универсальным типом Class является «Тип» вместо «расширяет интерфейс».