Jaký je význam typového bezpečnostního varování v určitých generických formátech Java?

Translate

Jaký je významVarování Java?

Bezpečnost typu: Přetypování z Object do List <Integer> ve skutečnosti kontroluje proti vymazanému seznamu List

Toto varování se zobrazí, když se pokusím vrhnout Object na typ s obecnými informacemi, jako například v následujícím kódu:

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

Všechny odpovědi

Translate

Toto varování existuje, protože Java ve skutečnosti neukládá informace o typu za běhu v objektu, který používá generika. Pokud tedyobjectje ve skutečnostiList<String>, nebude žádnáClassCastExceptionza běhu, kromě doby, dokud nebude ze seznamu přistupována položka, která neodpovídá obecnému typu definovanému v proměnné.

To může způsobit další komplikace, pokud jsou do seznamu přidány položky s touto nesprávnou informací o obecném typu. Jakýkoli kód, který stále obsahuje odkaz na seznam, ale se správnými informacemi o obecném typu, bude mít nyní nekonzistentní seznam.

Chcete-li varování odstranit, zkuste:

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

Všimněte si však, že nebudete moci používat určité metody, například přidat, protože kompilátor neví, jestli se pokoušíte přidat objekt nesprávného typu. Výše uvedené bude fungovat v mnoha situacích, ale pokud budete muset použít add nebo nějakou podobně omezenou metodu, budete muset trpět žlutým podtržením v Eclipse (neboSuppressWarninganotace).

Zdroj
Leave a Reply
You must be logged in to post a answer.