2012-03-20 2 views

ответ

6

<T> сообщает Java, что это общий метод, который определяет свой собственный параметр типа, вместо того, чтобы полагаться на один, определенный для всего класса, например.

public class Stuff<T> {}

2

Это не помогает вообще.

На сайте вызова он позволяет присвоить результат List с любым параметром типа, который не является безопасным для типа. Весь этот код просто наделяет вас ложным чувством безопасности. Если он вернется, например, в List<String>, то, как написано, вам будет разрешено присвоить этот результат List<Integer>, и вы не будете знать, что добрались до конца (когда вы пытаетесь получить доступ к элементу и назначьте его Integer), и неявный бросок взорвется вам в лицо.

Как правило, если общий метод (например, тот, который имеет свои собственные параметры типа, отдельно от класса, в котором он является членом), только один раз использует свой параметр типа и/или использует его только для возвращаемого значения, это общий отход времени!

+0

К сожалению, это является наименее болезненным способом борьбы с унаследованными API, который возвращает простой 'list', но вы _know_ что это на самом деле возвращает 'Список '. – mitchnull

+0

Я согласен с @mitchnull. Здесь произошло то же самое: http://stackoverflow.com/questions/115692/how-to-avoid-type-safety-warnings-with-hibernate-hql-results и Спасибо за понимание того, что здесь происходит! – brainydexter

+0

Это, вероятно, единственное допустимое использование – dty

0

Это то, что сообщает java, что listAndCast - это общий метод, который зависит от типа T.

сторона примечание: Я предпочитаю эту реализацию этой проблемы, так как это более общий характер:

@SuppressWarnings("unchecked") 
public <T> List<T> list_cast(List<?> orig) { 
    return (List<T>)orig; 
} 
+0

натолкнулось на это и подумало, что вам может быть интересно: http://stackoverflow.com/a/115952/280924 – brainydexter

0

Вам не нужно <T>, но это не остановить предупреждения компилятора. Компилятор заключит, что возвращается List<Object> (у него нет другой информации о типе, который будет возвращен).

Это в основном так же, как:

public static List listAndCast(Query query) 

Без предупреждений о сырых типов.

<T> может быть полезно, если передается аргумент параметрироваться с <T>, например:

public static <T> List<T> listAndCast(Query<T> query) 
+0

Как вы узнаете целевой тип трансляции, если вы не передадите тип аргумент? – Gabber

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