Qual é a diferença entre '&' e ',' em genéricos Java?

110

Ao ler o tutorial oficial Java sobre genéricos, descobri que você pode restringir o argumento de tipo (neste caso é T) para estender uma classe e / ou mais interfaces com o operador 'e' ( &) como este:

<T extends MyClass & Serializable>

Substituí o &por ,(por engano e ainda funciona, com um pequeno aviso).

Minha pergunta é, há alguma diferença entre esses dois:

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

E o método de exemplo:

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
fonte
5
@Doorknob você está assumindo que o OP está usando um teclado e o mesmo teclado que você está usando.
emory
3
@emory Acho que até essa direção está errada - o erro não estava em seus dedos, mas em seu cérebro. Da mesma forma como se você tivesse tentado usar 'incluir' em vez de 'importar' em um arquivo de origem Java. Você digitou 'include' incorretamente porque seu cérebro lhe disse para digitar a coisa errada, o que é possível por vários motivos.
Nick Pickering
2
@Nicholas Pickering, está certo! Para mim, não foi um erro de digitação por causa do teclado, mas por causa do cérebro. Quando você escreve quais interfaces uma classe implementa, você as separa por vírgulas.
Alin Ciocan

Respostas:

169
<T extends MyClass & Serializable>

Isso afirma que o parâmetro de tipo único deve ser Testendido MyClasse deve ser Serializable.

<T extends MyClass , Serializable>

este declara dois parâmetros de tipo, um chamado T(que deve ser estendido MyClass) e um chamado Serializable(que oculta java.io.Serializable- provavelmente é sobre isso que o aviso se refere).

Arshajii
fonte