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

C++ является стандартом, не должно быть никаких скрытых функций...

C++ является языком мультипарадигмы, можно поставить последние деньги там будучи скрытыми функциями. Один пример из многих: шаблонное метапрограммирование . Никто в комитете по стандартам не намеревался там быть полным по Тьюрингу подъязыком, который выполняется во время компиляции.

14
задан Michael Petrotta 20 March 2013 в 04:44
поделиться

5 ответов

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

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

addAndReturn(myElement, col).SomeMethodOfMyElement();

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

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

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

addAndReturn(myElement, col);
myElement.SomeMethodOfMyElement;

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


РЕДАКТИРОВАТЬ: Теперь, когда ваш вопрос отформатирован, я посмотрите, что одним из параметров является Коллекция . В этом случае общий синтаксис гарантирует, что

addAndReturn(mySquare, collectionOfCircles);

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


РЕДАКТИРОВАТЬ: И на всякий случай ваш вопрос касался синтаксиса а не об использовании дженериков в целом: сообщает компилятору, что T , используемый в определении метода, не некоторый класс T, а скорее заполнитель для любого класса, «подходящего» для конкретного вызова метода.

вам нужно будет использовать либо

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

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

addAndReturn(myElement, col);
myElement.SomeMethodOfMyElement;

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


РЕДАКТИРОВАТЬ: Теперь, когда ваш вопрос отформатирован, я вижу, что один из параметров - Сборник . В этом случае общий синтаксис гарантирует, что

addAndReturn(mySquare, collectionOfCircles);

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


РЕДАКТИРОВАТЬ: И на всякий случай ваш вопрос касался синтаксиса а не об использовании дженериков в целом: сообщает компилятору, что T , используемый в определении метода, не некоторый класс T, а скорее заполнитель для любого класса, «подходящего» для конкретного вызова метода.

вам нужно будет использовать либо

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

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

addAndReturn(myElement, col);
myElement.SomeMethodOfMyElement;

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


РЕДАКТИРОВАТЬ: Теперь, когда ваш вопрос отформатирован, я вижу, что один из параметров - Сборник . В этом случае общий синтаксис гарантирует, что

addAndReturn(mySquare, collectionOfCircles);

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


РЕДАКТИРОВАТЬ: И на всякий случай ваш вопрос касался синтаксиса а не об использовании дженериков в целом: сообщает компилятору, что T , используемый в определении метода, не некоторый класс T, а скорее заполнитель для любого класса, «подходящего» для конкретного вызова метода.

Теперь, когда ваш вопрос отформатирован, я вижу, что одним из параметров является Collection . В этом случае общий синтаксис гарантирует, что

addAndReturn(mySquare, collectionOfCircles);

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


РЕДАКТИРОВАТЬ: И на всякий случай ваш вопрос касался синтаксиса а не об использовании дженериков в целом: сообщает компилятору, что T , используемый в определении метода, не некоторый класс T, а скорее заполнитель для любого класса, «подходящего» для конкретного вызова метода.

Теперь, когда ваш вопрос отформатирован, я вижу, что одним из параметров является Collection . В этом случае общий синтаксис гарантирует, что

addAndReturn(mySquare, collectionOfCircles);

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


РЕДАКТИРОВАТЬ: И на всякий случай ваш вопрос касался синтаксиса а не об использовании дженериков в целом: сообщает компилятору, что T , используемый в определении метода, не некоторый класс T, а скорее заполнитель для любого класса, «подходящего» для конкретного вызова метода.

4
ответ дан 1 December 2019 в 15:12
поделиться

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

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

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

-1
ответ дан 1 December 2019 в 15:12
поделиться

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

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

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

-1
ответ дан 1 December 2019 в 15:12
поделиться

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

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

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

-1
ответ дан 1 December 2019 в 15:12
поделиться
> public static <T> T addAndReturn(T
> element, Collection<T> collection){
>     collection.add(element);
>     return element; }

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

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

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

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

9
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: