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;
}
Alin Ciocan
quelle
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).

arshajii
quelle