Jaka jest różnica między znakami „&” i „,” w generycznych językach Java?

110

Podczas czytania oficjalnego samouczka Java na temat generycznych stwierdziłem, że możesz ograniczyć argument type (w tym przypadku T), aby rozszerzyć klasę i / lub więcej interfejsów za pomocą operatora `` and '' ( &) w następujący sposób:

<T extends MyClass & Serializable>

I otrzymuje &się ,(przez pomyłkę i wciąż działa, z ostrzeżeniem moll).

Moje pytanie brzmi, czy jest jakaś różnica między tymi dwoma:

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

I przykładowa metoda:

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
źródło
5
@Doorknob zakładasz, że OP używa klawiatury i tej samej klawiatury, której używasz.
emory
3
@emory Myślę, że nawet to jest zły kierunek - błąd nie tkwił w jego palcach, ale w mózgu. Podobnie jak w przypadku próby użycia „include” zamiast „import” w pliku źródłowym Java. Błędnie wpisałeś „dołącz”, ponieważ mózg podpowiedział ci, aby wpisać niewłaściwą rzecz, co jest możliwe z różnych powodów.
Nick Pickering
2
@Nicholas Pickering, ma rację! Dla mnie to nie była pomyłka z powodu klawiatury, ale z powodu mózgu. Kiedy piszesz, które interfejsy implementuje klasa, oddzielasz je przecinkami.
Alin Ciocan

Odpowiedzi:

169
<T extends MyClass & Serializable>

To potwierdza, że ​​pojedynczy parametr typu Tmusi być rozszerzany MyClassi musi być Serializable.

<T extends MyClass , Serializable>

To deklaruje dwa parametry typu, jeden wywołany T(który musi rozszerzyć MyClass) i jeden wywołany Serializable(który ukrywa java.io.Serializable- prawdopodobnie o to chodziło w ostrzeżeniu).

arshajii
źródło