Каково использование <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-дженерикам, который я нахожу полным и просвещенным.