Разница между instanceof List и instanceof List‹?›

Я знаю, что мы не можем вызывать instanceof List<E>, потому что List<E> не является реализуемым типом. И instanceof List, и instanceof List<?> работают; однако IDE eclipse предлагает использовать instanceof List<?>.

Интересно, почему он предлагает несвязанный подстановочный знак instanceof List<?> вместо необработанного вызова instanceof List. Имеет ли несвязанный подстановочный знак instanceof List<?> какое-либо преимущество перед необработанным вызовом instanceof List?

Заранее спасибо.

Редактировать 1: по сути, instanceof List и instanceof List<?> совпадают, так как компилятор удалит тип при компиляции. Но помимо косметической причины, как указывает Мена, есть ли какая-либо другая причина использовать instanceof List<?> в пользу instanceof List?

Изменить 2. Согласно этой записи от Oracle:

  1. Тип выражения instanceof/cast является необработанным

Это происходит очень часто, так как javac запрещает выражения instanceof, целевой тип которых является универсальным типом; для приведения компилятор немного более либерален, поскольку приведение к общему типу разрешено, но выдается предупреждение (см. выше). В любом случае необработанный тип следует заменить неограниченным подстановочным знаком, поскольку они имеют схожие свойства по отношению к типу. подтип.

Object o = new ArrayList<String>(); List<?> list_string = (List)o; //same as (List<?>)o boolean b = o instanceof List; //same as o instanceof List<?>

Таким образом, мы можем сделать вывод, что помимо косметической причины, как сказал Мена, и ограничения на использование генетики, instanceof List и instanceof List<?> одинаковы.


person Linh    schedule 05.08.2015    source источник
comment
Нет никакой разницы   -  person CoderNeji    schedule 05.08.2015
comment
это может вам помочь   -  person earthmover    schedule 05.08.2015
comment
Дубликат Generics и знак вопроса   -  person SDekov    schedule 05.08.2015
comment
Есть вопрос, если почти такой же заголовок, как ваш вопрос ... вы хотя бы пробовали его сначала искать?   -  person Tom    schedule 05.08.2015
comment
Да, я видел этот вопрос. Ответ объясняет, что оба имеют одинаковые эффекты, поскольку подстановочный знак стирается во время компиляции. Но почему затмение рекомендует instanceof List<?> вместо instanceof List<>?   -  person Linh    schedule 05.08.2015
comment
Поскольку instanceof List<> не будет компилироваться, а instanceof List следует избегать, поскольку следует избегать необработанных типов (stackoverflow.com/questions/2770321/), поэтому он пытается научить вас избегать их.   -  person Tom    schedule 05.08.2015


Ответы (3)


«List<E> не является реализуемым типом» — не лучший способ сформулировать, почему instanceof не будет компилироваться.

Оператор instanceof проверяет тип вашего объекта во время выполнения.

Таким образом, удаление типа не позволяет Java узнать свой параметризованный тип ( тип между <>).

Следовательно, необработанный List (эквивалентный List<Object>) или List<?> (т. е. List неизвестного типа) здесь практически означают одно и то же, хотя необработанный синтаксис обычно не рекомендуется (здесь, по косметическим причинам).

person Mena    schedule 05.08.2015

Список сам по себе является типом. Так что не будет никакой разницы, если вы измените тип внутри него.

person Burak Yıldırım    schedule 05.08.2015

Возможно, потому что List — необработанный тип, а List<?> — нет. Необработанные типы потенциально очень опасны, потому что они могут иметь много странных побочных эффектов.

Ссылку выложу, как только найду.

person OldCurmudgeon    schedule 05.08.2015
comment
Нет никакой разницы... Подстановочные знаки игнорируются во время компиляции... - person CoderNeji; 05.08.2015
comment
Да неужели? А что такого в несыром типе, если можно передать что угодно? Если бы это было List<? extends Something>, тогда это имело бы смысл. - person Branislav Lazic; 05.08.2015