2009-11-03 2 views
10

Я смущаюсь, когда сталкиваюсь с таким общим методом.Использование <T> в общедоступном статике <T> T addAndReturn (элемент T, коллекция <T>) {

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

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

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

+0

Ознакомьтесь с инструкциями по форматированию перед отправкой вопроса. Их довольно сложно пропустить. – Joe

+1

попробуйте форматировать примеры кода как код – NDM

+0

@Joe, @Nicky De Maeyer: Я исправил проблемы с форматированием и удалил PS. – Asaph

ответ

4

Альтернатива, используя объект вместо 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 а скорее заполнитель для любого класса, «подходящего» для конкретного вызова метода.

+1

Спасибо за последний комментарий EDIT. Это мой вопрос. Все, что мне нужно знать, это. Имеет ли следующие фрагменты кода для компилятора? Если да, то как? 1. общественности статической T addAndReturn (Коллекция коллекция) {} 2. общественности статической T addAndReturn (Collection коллекция) {} –

+0

Извините. На этот раз я тоже пропустил форматирование. Можете ли вы сообщить мне, как мне отформатировать мой код? –

+0

Во втором варианте компилятор считает, что вы создаете функцию, возвращающую класс T. Literal «T», как в «class T {...}». В первом варианте вы создаете функцию, которая работает для * all * classes: если вы передадите Integer и коллекцию , она вернет Integer. – Heinzi

-1

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

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

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

+2

Поскольку это java, я надеялся, что вы имели в виду Collection :) – penpen

-1

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

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

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

0

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

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

Here у вас есть хороший учебник по Java генериков, которые я нахожу полное и поучительный ,

8
> 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 в качестве возвращаемого типа, тип возвращаемого значения имеет общий тип, который вы предоставляете на сайте вызова.