¿Cuál es la diferencia entre '&' y ',' en los genéricos de Java?

110

Mientras leía el tutorial oficial de Java sobre genéricos, descubrí que puede restringir el argumento de tipo (en este caso es T) para extender una clase y / o más interfaces con el operador 'y' ( &) de esta manera:

<T extends MyClass & Serializable>

Reemplacé el &con ,(por error y todavía funciona, con una advertencia menor).

Mi pregunta es, ¿hay alguna diferencia entre estos dos?

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

Y el método de ejemplo:

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
fuente
5
@Doorknob está asumiendo que el OP está usando un teclado y el mismo teclado que está usando.
emory
3
@emory Creo que incluso esa es la dirección equivocada: el error no estaba en sus dedos sino en su cerebro. De manera similar a como si hubiera intentado usar 'incluir' en lugar de 'importar' en un archivo fuente de Java. Escribió mal "incluir" porque su cerebro le dijo que escribiera algo incorrecto, lo cual es posible por varias razones.
Nick Pickering
2
@Nicholas Pickering, ¡tiene razón! Para mí, no fue un error de escritura por el teclado, sino por el cerebro. Cuando escribe qué interfaces implementa una clase, las separa por comas.
Alin Ciocan

Respuestas:

169
<T extends MyClass & Serializable>

Esto afirma que el parámetro de tipo único Tdebe extenderse MyClassy debe ser Serializable.

<T extends MyClass , Serializable>

Esto declara dos parámetros de tipo, uno llamado T(que debe extenderse MyClass) y otro llamado Serializable(que se oculta java.io.Serializable; probablemente de esto se trataba la advertencia).

arshajii
fuente