Каково использование <T> в публичном статическом элементе <T> T addAndReturn (T, Collection <T>) {

Я запутываюсь, когда сталкиваюсь с таким общим методом.

public static <T> T addAndReturn(T element, Collection<T> collection){
    collection.add(element);
    return element;
}

Я не могу понять, почему в этом методе требуется <T>.

Кроме того, в чем разница между универсальными методами и методами, использующими синтаксис generics?

Ответ 1

> public static <T> T addAndReturn(T
> element, Collection<T> collection){
>     collection.add(element);
>     return element; }

<T> (в угловых скобках) известен как общий тип типа, тогда как T непосредственно предшествует имени метода - это тип возвращаемого значения. У вас может быть общий метод, который возвращает какой-либо другой тип, чем общий тип. Возможно, вам нужен метод, который добавляет элемент в коллекцию (например, объект типа T), и вместо того, чтобы возвращать добавленный объект (который также будет иметь тип T), вы хотите, чтобы он возвращал индекс этот элемент в коллекции, который всегда будет int.

Пример сигнатуры метода, где тип возвращаемого значения не является общим типом:

public static <T> Integer addAndReturn(T element, Collection<T> collection)

Общие методы, как и любой другой метод, могут иметь любой тип возврата, включая сам тип общего типа, любой другой тип класса, любой базовый или собственный тип данных или void. Вы можете ввести в заблуждение 2 несвязанных части сигнатуры метода, считая их зависимыми, когда они не являются. Они только "зависимы" в том смысле, что если вы используете T как возвращаемый тип, тип возвращаемого значения имеет общий тип, который вы предоставляете на сайте вызова.

Ответ 2

Альтернатива, используя объект вместо T, заставит функцию возвращать объект.

Когда он вернет T, вы можете сделать что-то вроде:

addAndReturn(myElement, col).SomeMethodOfMyElement();

Если вместо возвращаемого объекта addAndReturn вы должны использовать либо

((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement();

которому требуется явное приведение, или

addAndReturn(myElement, col);
myElement.SomeMethodOfMyElement;

которому требуется два оператора вместо одного.


EDIT: теперь, когда ваш вопрос был отформатирован, я вижу, что один из параметров - Collection<T>. В этом случае общий синтаксис гарантирует, что

addAndReturn(mySquare, collectionOfCircles);

возвращает ошибку времени компиляции вместо ошибки времени выполнения.


EDIT: И на всякий случай ваш вопрос касался синтаксиса <T>, а не об использовании генераторов вообще: <T> сообщает компилятору, что T, используемый в определении метода, не является некоторым классом T а скорее заполнитель для любого класса, "подходящего" для конкретного вызова метода.

Ответ 3

Это общий Т - просто заполнитель для более конкретного типа, который возвращается. В том случае, если вы указали T, это тип элемента, который вы добавляете в коллекцию.

Collection<int> intCollection = new Collection();
int addedInt = addAndReturn(5, intCollection);
addedInt == 5;

Поскольку все они T, а не T1 или T2, они должны быть тем же типом объекта, что и отдельный тип, потому что функция добавляет тип в общий набор

Ответ 4

T используется для полиморфных причин, если можно так выразиться. T - тип любого типа класса.

Тем не менее, если вы приходите к классу Customer, например, вы можете использовать этот вышеописанный метод для обработки вашего класса пользовательского типа Customer. T позволяет вам размещать любой желаемый тип.

T позволит вам использовать этот общий метод для ваших собственных пользовательских типов, как это будет сделано для типов значений или любых других типов. T становится типом, указанным в элементе.

Ответ 5

Этот метод возвращает тот же ввод element, вероятно, потому, что разработчики намеревались использовать Fluent Interface, как способ предоставления более читаемого API:

addAndReturn(myElement, col).doElementStuff().doOtherElementStuff();

Здесь у вас есть хороший учебник по Java-дженерикам, который я нахожу полным и просвещенным.