Jakie jest znaczenie ostrzeżenia dotyczącego bezpieczeństwa typu w niektórych rzutach ogólnych Java?

Translate

Jakie jest znaczenieOstrzeżenie Java?

Bezpieczeństwo typów: rzutowanie z obiektu na listę <Integer> faktycznie sprawdza względem wymazanego typu List

Otrzymuję to ostrzeżenie, gdy próbuję rzutować Object na typ z informacjami ogólnymi, takimi jak w poniższym kodzie:

Object object = getMyList();
List<Integer> list = (List<Integer>) object;
This question and all comments follow the "Attribution Required."

Wszystkie odpowiedzi

Translate

To ostrzeżenie pojawia się, ponieważ Java w rzeczywistości nie przechowuje informacji o typach w czasie wykonywania w obiekcie, który używa typów ogólnych. Tak więc, jeśliobjectjest w rzeczywistościList<String>, nie będzieClassCastExceptionw czasie wykonywania, z wyjątkiem momentu uzyskania dostępu do elementu z listy, który nie jest zgodny z typem ogólnym zdefiniowanym w zmiennej.

Może to spowodować dalsze komplikacje, jeśli elementy zostaną dodane do listy z tymi nieprawidłowymi informacjami o typie ogólnym. Każdy kod, który nadal zawiera odwołanie do listy, ale z poprawnymi informacjami o typie ogólnym, będzie miał teraz niespójną listę.

Aby usunąć ostrzeżenie, spróbuj:

List<?> list = (List<?>) object;

Pamiętaj jednak, że nie będziesz w stanie użyć niektórych metod, takich jak add, ponieważ kompilator nie wie, czy próbujesz dodać obiekt niepoprawnego typu. Powyższe będzie działać w wielu sytuacjach, ale jeśli będziesz musiał użyć add lub innej podobnie ograniczonej metody, będziesz musiał po prostu cierpieć z powodu żółtego podkreślenia w Eclipse (lubSuppressWarningadnotacja).

Źródło