Ошибка компиляции дженериков Java - метод метода (Class ) в типе неприменим для аргументов.

В прошлый четверг кто-то на работе показал мне ошибку компиляции, которую я не смог исправить чисто, и с тех пор меня беспокоит.

Проблема связана с дженериками, и я восстановил упрощенную версию кода, который генерирует ошибку компиляции. Ошибка возникает в самой последней строке кода, показанной ниже.

Я просмотрел всю сеть, но, похоже, не нашел достойного объяснения, почему компилятор 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».

5
задан Basje 5 November 2011 в 17:28
поделиться