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

359
21 марта 2017, 11:36

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

class Main {
    public static void main(String[] args) {
        System.out.println("Compiled successfully.");
    }
    private static <T extends SomeType> void foo(T genericVar) {
        // ...
        bar(genericVar.getClass(), genericVar);
        // ...
    }
    private static <E extends SomeType> void bar(Class<E> theClass, E instance) {
        // Do something
    }
}
class SomeType {} 

<!-- Нужно нажать "Выполнить код", чтобы отобразить сниппет (костыли :D)  --> 
<script src="//repl.it/embed/G3VH/3.js"></script>

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

Main.java:8: error: method bar in class Main cannot be applied to given types;
    bar(genericVar.getClass(), genericVar);
    ^
  required: Class<E>,E
  found: Class<CAP#1>,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 <E>bar(Class<E>,E)
    T extends SomeType declared in method <T>foo(T)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends SomeType from capture of ? extends SomeType
1 error

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

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

Answer 1

getClass() возвращает тип Class<? extends T>

class Main {
  public static void main(String[] args) {
    System.out.println("Compiled successfully.");
  }
  private static <T extends SomeType> void foo(T genericVar) {
    // ...
    bar(genericVar.getClass(), genericVar);
    // ...
  }
  private static <E extends SomeType> void bar(Class<? extends E> theClass, E instance) {
    // Do something
  }
}
class SomeType {}

<!-- Нужно нажать "Выполнить код", чтобы отобразить сниппет (костыли :D)  --> 
<script src="//repl.it/embed/G3VH/6.js"></script>

READ ALSO
При подключении к AWS нужно ставить java?

При подключении к AWS нужно ставить java?

Всем привет тут читаю о подключении к AWS http://docsaws

286
Как сделать невидимый цвет у seekbar?

Как сделать невидимый цвет у seekbar?

Как сделать transparent у seekBargetProgressDrawable()? Делая seekBar

337
Как создать пиксель закрашенный цветом?

Как создать пиксель закрашенный цветом?

Как создать пиксель закрашенный цветом? Необходимо на activity создать пиксель, закрашенный цветомСамым простым способом

282