чем отличается T func0() {} от T func() {} в java?
чем отличается T func0() {} от <T> T func() {} в java?
Ответы (1 шт):
На самом деле, тут без контекста нельзя однозначно ответить. Возможны две ситуации:
- Методы находятся в обобщённом классе с типом
T - Методы находятся в обычном классе
Рассмотрим первый случай:
class Byb<T> {
T func1(T a) {
return a;
}
<T> T func2(T a) {
return a;
}
}
Первый метод будет использовать тип T, передаваемый классу. Вполне естественный вариант, тут всё очевидно.
У второго метода мы явно пишем тип T. В этом случае он скроет тип T у класса и будет использовать свой тип T. Можем убедиться в этом на примере:
Byb<Integer> byb = new Byb<>();
System.out.println(byb.func1(5).getClass());
System.out.println(byb.func2("Hello").getClass());
Результат:
class java.lang.Integer
class java.lang.String
Классу передали Integer, но в метод со своим типом T передали String, и тип T стал именно String-ом.
Рассмотрим второй случай:
class Byb {
T func1(T a) {
return a;
}
<T> T func2(T a) {
return a;
}
}
Теперь первая функция просто-напросто неверна. Мы не знаем, что такое тип T, так как его нет ни у класса, ни явно прописанного у метода. Из-за этой функции код не запустится.
А по второй функции - всё так же, как было описано для первого случая. Будет просто использоваться свой тип T.