Прошу прощения, если вопрос покажется глупым, но почему не компилируется этот код:
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, и это меня устраивает, но хочется понять из-за чего не получается скомпилировать именно так.
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>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем привет тут читаю о подключении к AWS http://docsaws
Как сделать transparent у seekBargetProgressDrawable()? Делая seekBar
Как создать пиксель закрашенный цветом? Необходимо на activity создать пиксель, закрашенный цветомСамым простым способом
Система macOS Sierra, установлен tesseract 304