Qual è la differenza tra "&" e "," nei generici Java?


110

Durante la lettura del tutorial ufficiale di Java sui generici, ho scoperto che puoi limitare l'argomento type (in questo caso è T) per estendere una classe e / o più interfacce con l'operatore 'and' ( &) in questo modo:

<T extends MyClass & Serializable>

Ho sostituito il &con ,(per errore e funziona ancora, con un piccolo avvertimento).

La mia domanda è, c'è qualche differenza tra questi due:

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

E il metodo di esempio:

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 stai assumendo che l'OP stia usando una tastiera e la stessa tastiera che stai usando.
emory

3
@emory Penso che anche quella sia sbagliata nella direzione - l'errore non era nelle sue dita ma nel suo cervello. Analogamente a come se avessi provato a utilizzare "include" invece di "import" in un file sorgente Java. Hai digitato male "include", perché il tuo cervello ti ha detto di digitare la cosa sbagliata, il che è possibile per vari motivi.
Nick Pickering

2
@Nicholas Pickering, ha ragione! Per me, non è stato un errore di battitura a causa della tastiera, ma a causa del cervello. Quando scrivi quali interfacce implementa una classe, le separi con una virgola.
Alin Ciocan

Risposte:


169
<T extends MyClass & Serializable>

Ciò afferma che il parametro di tipo singolo Tdeve estendersi MyClasse deve essere Serializable.

<T extends MyClass , Serializable>

Questo dichiara due parametri di tipo, uno chiamato T(che deve estendersi MyClass) e uno chiamato Serializable(che nasconde java.io.Serializable- questo è probabilmente ciò di cui si trattava l'avvertimento).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.