Дженерик методы и верхняя граница
Есть три класса:
class A{
}
class B{
}
class Gen<T, V extends T>{
}
Следующая программа не скомпилируется:
class Main{
public static void main(String[] args){
Gen<A, B> g;
}
}
ведь V обязательно должен быть либо таким же как T, либо его подклассом.
Теперь есть такой код:
class Main{
public static <T, V extends T> void qq(T x, V y){
}
public static void main(String[] args){
qq(new A(), new B());
}
}
Я ожидаю, что он точно так же не скомпилируется, так как B не наследуется от A, но тем не менее всё отлично работает. Почему?
Ответы (1 шт):
Автор решения: Roman-Stop RU aggression in UA
→ Ссылка
В Gen<A, B> g вы явно указали, что T=A и V=B - по очевидным причинам это не может скомпилироваться, типы не совместимы.
В qq(new A(), new B()) вы не указали типов для qq явно, компилятор делает вывод типов, т.е. находит подходящие. И в этом случае нашел T=Object и V=B.
Если явно укажите типы Main.<A, B>qq(new A(), new B()) - получите такую же ошибку.