Как правило, вам нужна только переменная типа, когда она используется более чем в одном месте в объявлениях класса/метода/поля. Когда вы объявляете один из методов (а не класса), единственными его местами являются параметры и возвращаемое значение этого метода.
Например, вы можете использовать его по нескольким параметрам для обеспечения их типов соответствия
public static <T> void addToList(List<T> list, T element) {
list.add(element);
}
Это тривиальный пример, но вы можете видеть, что это мешает вам придав ему элемент, который не делает соответствует общий тип списка в:
List<Integer> list = new ArrayList<>();
addToList(list, 7);
//addToList(list, 0.7); // doesn't compile
//addToList(list, "a"); // doesn't compile
Вы также можете объявить параметр и тип возвращаемого быть тот же тип:
public static <T> T nullCheck(T value, T defValue) {
return value != null ? value : defValue;
}
Поскольку этот метод возвращает один из двух заданных объектов T
, мы можем с уверенностью сказать, что возвращаемый объект также имеет тип T
.
Integer iN = null;
Integer i = nullCheck(iN, 7);
System.out.println(i); // "7"
Double dN = null;
Double d = nullCheck(dN, 0.7);
System.out.println(d); // "0.7"
Number n = nullCheck(i, d); // T = superclass of Integer and Double
System.out.println(n); // "7"
Что касается, например, в вопросе, тип переменной только используется один раз, так что это эквивалентно использованию суперкласса. В этом случае вам следует избегать объявления переменной типа, это просто лишний беспорядок.
Также следует отметить, что другой ответ изменяет пример использования List<T>
и List<Foo>
, но, как упоминалось в комментариях, суперкласс действительно List<? extends Foo>
, поэтому нет тип переменной нужен там, либо.
Я вижу. Есть ли причина использовать суперкласс в качестве параметра? Или это просто соглашение использовать его, когда вы можете? – Someone
@Someone Когда вы просто передаете один аргумент типа 'Foo' или его подтип, вам не нужен общий метод. Вы можете передать экземпляр подкласса 'Foo' в тип параметра' Foo'. –
Это отвечает на другой вопрос. В исходном вопросе 'Foo' является супертипом' T'. Если в вашем случае 'List' не является супертипом 'List ', значит, так оно и есть. В вашем случае супертип для 'List ' вместо этого будет 'List extends Foo> '. –
newacct