2013-08-22 15 views
108

Podczas czytania oficjalnego samouczka języka Java na temat generycznych odkryłem, że można ograniczyć argument typu (w tym przypadku to T) w celu rozszerzenia klasy i/lub większej liczby interfejsów za pomocą operatora "i" (&) w następujący sposób:Jaka jest różnica między "&" a "," w generycznych Java?

<T extends MyClass & Serializable> 

Wymieniłem & na , (przez pomyłkę i nadal działa, z niewielkim ostrzeżeniem).

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

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

A metoda przykład:

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 zakładasz, że OP używa klawiatury i tej samej klawiatury, z której korzystasz. – emory

+3

Samouczek Myślę, że nawet to jest złe kierunek - błąd nie był w jego palcach, ale w jego mózgu. Podobnie, jakbyś próbował użyć "include" zamiast "importu" w źródłowym pliku Java. Błędnie wpisałeś "uwzględnij", ponieważ twój mózg kazał ci wpisać niewłaściwą rzecz, która jest możliwa z różnych powodów. –

+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. –

Odpowiedz

166
<T extends MyClass & Serializable> 

Ten twierdzi, że pojedynczy parametr typu T musi przedłużyć MyClass i musi być Serializable.

<T extends MyClass , Serializable> 

Ten deklaruje dwa parametry typu, jeden o nazwie T (który musi rozszerzyć MyClass) i jeden o nazwie Serializable (która ukrywa java.io.Serializable - to jest chyba to, co było ostrzeżenie o).

Powiązane problemy