我对Java中的泛型和instanceof
运算符有疑问。
制作这样的 instanceof check :
if (arg instanceof List<Integer>) // immposible due to
// loosing parameter at runtime
但是可以运行这个:
if (arg instanceof List<?>)
现在我的问题 - <{strong> arg instanceof List
和 arg instanceof List<?>
之间有什么区别吗?
答案 0 :(得分:5)
Java Generics由 erasure 实现,也就是说,附加类型信息(<...>
)在运行时将不可用,但会被编译器删除。它有助于静态类型检查,但不能在运行时进行检查。
由于instanceof
将在运行时执行检查,而不是在编译时执行检查,因此您无法在Type<GenericParameter>
表达式中检查instanceof ...
。
关于你的问题(你似乎已经知道泛型参数在运行时不可用),List
和List<?>
之间没有区别。后者是一个通配符,它基本上表示与没有参数的类型相同的东西。这是告诉编译器的一种方式“我知道我不知道这里的确切类型”。
instanceof List<?>
归结为instanceof List
- 这两者完全相同。
答案 1 :(得分:2)
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
在上面的main方法中,所有if语句都为真。所以很明显,在这种情况下List and List<?>
是相同的。