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;
}
Odpowiedzi:
To potwierdza, że pojedynczy parametr typu
T
musi być rozszerzanyMyClass
i musi byćSerializable
.To deklaruje dwa parametry typu, jeden wywołany
T
(który musi rozszerzyćMyClass
) i jeden wywołanySerializable
(który ukrywajava.io.Serializable
- prawdopodobnie o to chodziło w ostrzeżeniu).źródło