#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 staticvoid foo(T genericVar) { // ... bar(genericVar.getClass(), genericVar); // ... } private static void bar(Class theClass, E instance) { // Do something } } class SomeType {}
Комментариев нет:
Отправить комментарий