Экземпляр для универсального с <?> Или без <?>
У меня есть вопрос о дженериках в 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<?>
такие же.