Quelle est la différence entre «&» et «,» dans les génériques Java?

110

En lisant le tutoriel officiel Java sur les génériques, j'ai trouvé que vous pouvez restreindre l'argument de type (dans ce cas T) pour étendre une classe et / ou plusieurs interfaces avec l'opérateur 'et' ( &) comme ceci:

<T extends MyClass & Serializable>

J'ai remplacé le &par ,(par erreur et fonctionne toujours, avec un avertissement mineur).

Ma question est la suivante: y a-t-il une différence entre ces deux:

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

Et l'exemple de méthode:

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
la source
5
@Doorknob vous supposez que l'OP utilise un clavier et le même clavier que vous utilisez.
emory
3
@emory Je pense que même ce n'est pas la bonne direction - l'erreur n'était pas dans ses doigts mais dans son cerveau. De la même manière que si vous aviez essayé d'utiliser 'include' au lieu de 'import' dans un fichier source Java. Vous avez mal tapé «inclure», parce que votre cerveau vous a dit de taper la mauvaise chose, ce qui est possible pour diverses raisons.
Nick Pickering
2
@Nicholas Pickering, a raison! Pour moi, ce n'était pas une erreur de frappe à cause du clavier, mais à cause du cerveau. Lorsque vous écrivez les interfaces implémentées par une classe, vous les séparez par une virgule.
Alin Ciocan

Réponses:

169
<T extends MyClass & Serializable>

Cela affirme que le paramètre de type unique Tdoit s'étendre MyClasset doit l'être Serializable.

<T extends MyClass , Serializable>

Cela déclare deux paramètres de type, l'un appelé T(qui doit s'étendre MyClass) et l'autre appelé Serializable(qui cache java.io.Serializable- c'est probablement le sujet de l'avertissement).

arshajii
la source