Экземпляр для универсального с <?> Или без <?>

У меня есть вопрос о дженериках в Java и instanceof оператор.

Невозможно сделать такой экземпляр проверки:

if (arg instanceof List<Integer>)  // immposible due to
                                   // loosing parameter at runtime

но можно запустить это:

if (arg instanceof List<?>)


Теперь возникает мой вопрос - есть ли разница между arg instanceof List а также arg instanceof List<?>?

2 ответа

Решение

Java Generics реализуются путем стирания, то есть дополнительной информации о типе (<...>) не будет доступна во время выполнения, но будет стерта компилятором. Это помогает при статической проверке типов, но не во время выполнения.

поскольку instanceof будет выполнять проверку во время выполнения, а не во время компиляции, вы не можете проверить Type<GenericParameter> в instanceof ... выражение.

Что касается вашего вопроса (вы, вероятно, уже знаете, что универсальный параметр недоступен во время выполнения), нет разницы между List а также List<?>, Последний является групповым символом, который в основном выражает то же самое, что и тип без параметров. Это способ сказать компилятору: "Я знаю, что я не знаю точный тип здесь".

instanceof List<?> сводится к instanceof List - которые точно так же.

List and List < ? > не совпадают, но в этом случае, когда вы используете оператор instanceof, они означают одно и то же.

instanceof не может использоваться с Generics, поскольку Generics не хранит никакой информации о типе во время выполнения (из-за реализации стирания).

Эта точка проясняется ниже основным методом. Я объявил два списка (один типа Integer и другой типа String). И instanceof ведут себя одинаково для List and List < ? >

public static void main(String[] args){
    List<Integer> l = new ArrayList<Integer>();
    List<String> ls = new ArrayList<String>();

    if(l instanceof List<?>){
        System.out.print("<?> ");
    }

    if(l instanceof List){
        System.out.print("l ");
    }

    if(ls instanceof List<?>){
        System.out.print("<?> ");
    }

    if(ls instanceof List){
        System.out.print("ls ");
    }
     }

вывод: <?> l <?> ls

В приведенном выше основном методе все утверждения if верны. Итак, ясно, что в этом случае List and List<?> такие же.

Другие вопросы по тегам