чем отличается T func0() {} от <T> T func() {} в java?

Рейтинг: -1Ответов: 1Опубликовано: 06.06.2023

чем отличается T func0() {} от <T> T func() {} в java?

Ответы

▲ 2

На самом деле, тут без контекста нельзя однозначно ответить. Возможны две ситуации:

  1. Методы находятся в обобщённом классе с типом T
  2. Методы находятся в обычном классе

Рассмотрим первый случай:

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.