Яка різниця між "&" та "," у дженеріках Java?


110

Читаючи офіційний підручник 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;
}

5
@Doorknob ви припускаєте, що ОП використовує клавіатуру та ту саму клавіатуру, що і ви.
emory

3
@emory Я думаю, що навіть це неправильний напрямок - помилка була не в його пальцях, а в його мозку. Так само, як якщо б ви намагалися використати "включити" замість "імпорту" у вихідному файлі Java. Ви неправильно ввели "включити", тому що ваш мозок сказав вам ввести неправильну річ, що можливо з різних причин.
Нік Пікерінг

2
@Nicholas Pickering, правильно! Для мене це було не місією через клавіатуру, а через мозок. Коли ви пишете, які інтерфейси реалізує клас, ви розділяєте їх комою.
Алін Чьокан

Відповіді:


169
<T extends MyClass & Serializable>

Це стверджує, що параметр одного типу Tповинен бути розширеним MyClassі повинен бути Serializable.

<T extends MyClass , Serializable>

Це оголошує два параметри типу: один називається T(який повинен поширюватися MyClass) та один, який називається Serializable(який приховує java.io.Serializable- це, мабуть, про це було попередження).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.