Was ist der Unterschied zwischen '&' und ',' in Java-Generika?


110

Beim Lesen des offiziellen Java-Tutorials zu Generika habe ich festgestellt, dass Sie das Typargument (in diesem Fall T) einschränken können , um eine Klasse und / oder mehrere Schnittstellen mit dem Operator 'und' ( &) wie folgt zu erweitern :

<T extends MyClass & Serializable>

Ich ersetzte die &mit ,(durch Fehler und funktioniert immer noch, mit einer kleinen Warnung).

Meine Frage ist, gibt es einen Unterschied zwischen diesen beiden:

<T extends MyClass & Serializable>
<T extends MyClass , Serializable> // here is with comma

Und die Beispielmethode:

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 Sie gehen davon aus, dass das OP eine Tastatur und dieselbe Tastatur wie Sie verwendet.
— Emory

3
@emory Ich denke sogar das ist die Richtung falsch - der Fehler war nicht in seinen Fingern, sondern in seinem Gehirn. Ähnlich wie wenn Sie versucht hätten, 'include' anstelle von 'import' in einer Java-Quelldatei zu verwenden. Sie haben "include" falsch eingegeben, weil Ihr Gehirn Ihnen gesagt hat, dass Sie das Falsche eingeben sollen, was aus verschiedenen Gründen möglich ist.
— Nick Pickering

2
@ Nicholas Pickering, ist richtig! Für mich war es kein Fehler wegen der Tastatur, sondern wegen des Gehirns. Wenn Sie schreiben, welche Schnittstellen eine Klasse implementiert, trennen Sie sie durch Komma.
— Alin Ciocan

Antworten:


169
<T extends MyClass & Serializable>

Dies bestätigt, dass der einzelne Typparameter Terweitert werden muss MyClassund sein muss Serializable.

<T extends MyClass , Serializable>

Dies deklariert zwei Typparameter, einen aufgerufenen T(der erweitert werden muss MyClass) und einen aufgerufenen Serializable(der sich versteckt java.io.Serializable- darum ging es wahrscheinlich in der Warnung).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.