В чем разница между '&' и ',' в дженериках Java?

110

Читая официальный учебник Java по дженерикам, я обнаружил, что вы можете ограничить аргумент типа (в данном случае T), чтобы расширить класс и / или несколько интерфейсов с помощью оператора 'and' ( &) следующим образом:

<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;
}
Алин Чокан
источник
5
@Doorknob, вы предполагаете, что OP использует клавиатуру и ту же клавиатуру, что и вы.
emory
3
@emory Я думаю, что даже это неправильное направление - ошибка была не в его пальцах, а в его мозгу. Точно так же, как если бы вы пытались использовать «include» вместо «import» в исходном файле Java. Вы ошиблись при вводе слова «включить», потому что ваш мозг сказал вам ввести неправильный текст, что возможно по разным причинам.
Ник Пикеринг,
2
@ Николас Пикеринг, верно! Для меня это была опечатка не из-за клавиатуры, а из-за мозга. Когда вы пишете, какие интерфейсы реализует класс, вы разделяете их запятыми.
Алин Чокан

Ответы:

169
<T extends MyClass & Serializable>

Это утверждает, что параметр единственного типа Tдолжен расширяться MyClassи должен быть Serializable.

<T extends MyClass , Serializable>

Здесь объявляются два параметра типа: один вызываемый T(который должен расширяться MyClass) и один вызываемый Serializable(который скрывает java.io.Serializable- вероятно, это то, о чем было предупреждение).

аршаджи
источник