В чем разница между '&' и ',' в Java-дженериках?
Во время чтения официального учебника Java о дженериках я обнаружил, что вы можете ограничить аргумент типа (в данном случае - T
) расширять класс и/или больше интерфейсов с помощью оператора "и" (&
) например:
<T extends MyClass & Serializable>
Я заменил &
на ,
(по ошибке и все еще работает с незначительным предупреждением).
Мой вопрос в том, есть ли разница между этими двумя:
<T extends MyClass & Serializable>
<T extends MyClass , Serializable> // here is with comma
И пример метода:
static <T extends MyClass & Serializable> ArrayList<T> fromArrayToCollection(T[] a) {
ArrayList<T> arr = new ArrayList<T>();
for (T o : a) {
arr.add(o); // Correct
}
return arr;
}
Ответы
Ответ 1
<T extends MyClass & Serializable>
Это означает, что параметр одиночного типа T
должен расширять MyClass
и должен быть Serializable
.
<T extends MyClass , Serializable>
Это объявляет два типа параметров, один из которых называется T
(который должен расширять MyClass
), а один из них называется Serializable
(который скрывает java.io.Serializable
- это, вероятно, предупреждение).