Представьте, что у нас есть следующий универсальный класс:
public class GenericClass<U> {
private U value;
public GenericClass(U value) {
this.value = value;
}
}
и следующий общий метод в другом классе MyClass:
public <T extends BT, BT> void genericMethod(T arg) {
Object genericClass = new GenericClass<BT>(arg);
}
Какое значение получит параметр типа BT, если мы вызовем
genericMethod("text");
?
Некоторые примечания:
Код выше компилируется без ошибок и предупреждений, что мне кажется странным. Декомпиляция (с помощью IntelliJ IDEA 2016) показывает следующий код:
public <T extends BT, BT> void genericMethod(T arg) {
new MyClass.GenericClass(arg);
}
Обратите внимание, что новый GenericClass<BT>(arg)
не совпадает с new GenericClass(arg)
, потому что последний эквивалентен new GenericClass<T>(arg)
(вывод типа), и хотя T extends BT
это разные типы, а GenericClass
может иметь внутреннюю логику, где точный имя типа играет важную роль (например, используется в качестве строкового ключа в некоторых картах и т. д.). Поэтому для меня странно, почему компилятор молча использует вывод типа вместо того, чтобы выдать какое-то предупреждение (или, может быть, даже ошибку) о том, что параметр типа BT не указан. Может быть, я что-то упускаю. важно о дженериках в Java, однако...