Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Что значит: Inference variable T has incompatible bounds

#java #generics


Прошу прощения, если вопрос покажется глупым, но почему не компилируется этот код:

class Main {
    public static void main(String[] args) {
        System.out.println("Compiled successfully.");
    }

    private static  void foo(T genericVar) {
        // ...
        bar(genericVar.getClass(), genericVar);
        // ...
    }

    private static  void bar(Class theClass, E instance) {
        // Do something
    }
}

class SomeType {} 










При компиляции получается следующее:

Main.java:8: error: method bar in class Main cannot be applied to given types;
    bar(genericVar.getClass(), genericVar);
    ^
  required: Class,E
  found: Class,T
  reason: inference variable E has incompatible bounds
    equality constraints: CAP#1
    lower bounds: T
  where E,T are type-variables:
    E extends SomeType declared in method bar(Class,E)
    T extends SomeType declared in method foo(T)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends SomeType from capture of ? extends SomeType
1 error


Вижу, что передаётся неверный второй параметр в функцию bar, но интересно узнать
почему так? Ведь по логике типы совместимы, да и с первым параметром не возникает проблем.

Сейчас, чтобы избежать ошибки, изменил тип второго параметра в bar() на SomeType,
и это меня устраивает, но хочется понять из-за чего не получается скомпилировать именно так.
    


Ответы

Ответ 1



getClass() возвращает тип Class class Main { public static void main(String[] args) { System.out.println("Compiled successfully."); } private static void foo(T genericVar) { // ... bar(genericVar.getClass(), genericVar); // ... } private static void bar(Class theClass, E instance) { // Do something } } class SomeType {}

Комментариев нет:

Отправить комментарий