Jestem nowy w niektórych z wbudowanych struktur danych w JAVA i zauważyłem podczas zabawy z LinkedList, że ten kod nie powoduje błędu:
LinkedList<?> list = new LinkedList<Integer>();
Czy ktoś może mi wyjaśnić, jak możemy to miećjako ważna deklaracja? Korzystam z Eclipse i po inicjalizacji nie wyświetla żadnych błędów. Jednak dodanie elementów po tym nie działa w tym przypadku.
Odpowiedzi:
4 dla odpowiedzi № 1W
LinkedList<?> list;
deklarujesz zmienną o nazwie list
typu LinkedList
i podając symbol wieloznaczny ?
jako argument typu do powiązania LinkedList
parametr typu T
. Więc list
będzie typu LinkedList<?>
. Ten symbol wieloznaczny ?
uchwyci jakiś typ, ale ten typ będzie nieznany i bezużyteczny.
To
new LinkedList<Integer>();
jest wyrażeniem tworzenia instancji. Tworzysz instancję typu LinkedList
podając argument typu typu Integer
być związanym z LinkedList
parametr typu T
. Typem wyrażenia tworzenia instancji będzie zatem LinkedList<Integer>
.
Pamiętaj, że będziesz wchodził w interakcje z utworzonym LinkedList
przez zmienną list
typu LinkedList<?>
. Niezależnie od tego, jakiego argumentu typu użyłeś do jego utworzenia, teraz patrzysz na to przez wartość typu LinkedList<?>
.
Teraz możesz przypisać wartość typu LinkedList<Integer>
do zmiennej typu LinkedList<?>
bo LinkedList<?>
jest super typem LinkedList<Integer>
. Możemy szczegółowo wyjaśnić, dlaczego tak jest, ale zasady są opisane tutaj.
Co się tyczy
LinkedList<?> list = new LinkedList<>();
notacja <>
oznacza, że należy wywnioskować argument typu dla wyrażenia tworzenia instancji. Zasady wnioskowania typu są liczne i złożone. Zasadniczo od ?
oznacza nieznany typ, jedyne, co możemy być pewni, to, że argumentem typu powinien być przynajmniej Object
ponieważ jest to nadtyp wszystkich typów. I dlatego to się wywodzi.
1 dla odpowiedzi nr 2
?
jako parametr ogólny w zasadzie oznacza „dowolną klasę” i Integer
zdecydowanie kwalifikuje się jako „dowolna klasa”, stąd niebłąd. Podczas inicjowania nie występują błędy, ponieważ nie są obecne generyczne typy, dlatego typ generyczny nie ma znaczenia po skompilowaniu kodu (prawie nie ma znaczenia)