Прошу прощения, если вопрос покажется глупым, но почему не компилируется этот код:
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>
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники