/ / Parametrizing LinkedList z „?” w java - java, link-list

Parametryzowanie LinkedList za pomocą „?” in java - java, linked-list

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 № 1

W

LinkedList<?> list;

deklarujesz zmienną o nazwie list typu LinkedList i podając symbol wieloznaczny ? jako argument typu do powiązania LinkedListparametr 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 LinkedListparametr 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)