2010-09-23 8 views
0

В чем разница между сигнатурами двух методов ниже?Разница между: <T> ReturnContainer test() и: <T> ReturnContainer <T> test()?

public static <T> ReturnContainer test(Class<T> incomingClass) 
{ 
    List<TestTuple<T>> tupelo = new ArrayList<TestTuple<T>>(); 
    ReturnContainer rc = new ReturnContainer(tupelo, incomingClass); 
    return rc; 
} 

Какая разница между требует возвращаемого типа <T> ReturnContainer выше по сравнению с <T> ReturnContainer<T> ниже?

public static <T> ReturnContainer<T> test(Class<T> incomingClass) 
{ 
    List<TestTuple<T>> tupelo = new ArrayList<TestTuple<T>>(); 
    ReturnContainer rc = new ReturnContainer<T>(tupelo, incomingClass); 
    return rc; 
} 
+1

Вы просили об этом раньше. Почему бы вам не изменить свой предыдущий вопрос? Точный дубликат: http://stackoverflow.com/questions/3777315/t-cannot-be-resolved-to-a-type –

+1

ReturnContainer rc = new ReturnContainer это правильно? Должен ли он быть ReturnContainer rc = new ReturnContainer ? – tkr

ответ

3

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

Например, вы могли бы иметь что-то вроде:

ReturnContainer<String> container = test(Integer.class); 

Это будет работать (но будет производить предупреждение), так как тип возврата является исходным типом. Тогда, когда вы попытаетесь получить что-то из контейнера, компилятор поверит, что это String, но на самом деле это Integer, и вы получите ClassCastException.

Edit: после того, как глядя на ваш предыдущий вопрос

Вы должны сказать нам, если ReturnContainer имеет параметр типа в первую очередь, или то, что точка класса есть. A <T> параметр полезен для классов контейнеров, таких как списки или карты, поскольку он непосредственно указывает, к каким типам объектов он содержит, в отличие от переноса объектов и позволяет отбрасывать их на что-либо, когда вы извлекаете их из контейнера. Они обеспечивают дополнительную безопасность. Вы точно знаете, что List<String>, как правило, содержит только строки, а get и add методы возвращают/принимают строки. Если ваш контейнер имеет подобное поведение, то он должен иметь параметр типа, и вы должны использовать второй метод.

0

Editted ответить на ваш вопрос лучше, и удалить с # версии :)

Возвращая ReturnContainer, вы даете информацию о возвращаемом типе внутренних объектов.

только передавая информацию о классе входящих, вы не давая информацию о ReturnContainer как таковой, или элементов в нем - только то, что параметр типа T.

+0

Да, они будут компилироваться, вы можете объявить метод с параметром общего типа. Ваша версия не компилируется: 'Синтаксическая ошибка на токене <<'. Я не уверен, что вы пытаетесь сделать, но вы не можете объявить метод, как 'methodName ' в Java. –

+0

LOL. Прочитайте его как вопрос C#. Мой плохой :) – tim

+0

Я снял свой маленький момент безумия - основное объяснение стоит, но, похоже, вы все-таки прикрыли это. – tim

Смежные вопросы