Próbuję dowiedzieć się o używaniu typów ogólnych i zauważyłem coś dziwnego, kiedy eksperymentowałem z pewnymi liniami kodu.Java - typy ogólne i kolekcje
Pierwszy kawałek kodu jest wewnątrz klasy o nazwie "A":
public void func(int k, List list) {
list.add(9);
list.add(true);
list.add("a string");
}
Drugi fragment kodu jest w innej klasie, wewnątrz funkcji main:
List<Integer> arr = new ArrayList<Integer>();
arr.add(14);
System.out.println(arr.toString());
a.func(8, arr);
System.out.println(arr.toString());
uruchamiając wyniki kodu w tym linie drukowane:
[14]
[14, 9, prawda, ciąg]
To dało mi całkiem zdezorientowany ponieważ arr
jest ArrayList
typu Integer
, w jaki sposób może zawierać obiekty typu boolean
i String
? Czy istnieje transformacja listy w funkcji func
na typ surowy (co oznacza, że staje się ona typem generycznym Object
)? A jeśli tak, to jak to jest możliwe, ponieważ nie możesz tego zrobić na przykład: List<Integer> arr = new ArrayList<Object>();
?
Chciałbym wyjaśnienia na ten temat, może pomoże mi to lepiej zrozumieć ten przedmiot rodzajów ogólnych. Dzięki!
Należy przeczytać o [RAW] (https://docs.oracle.com/javase/tutorial/ typy java/generics/rawTypes.html), a także [heap pollution] (https://docs.oracle.com/javase/tutorial/java/generics/nonReifiableVarargsType.html#heap_pollution). – Flown