java Instanceof for generic with<?>或者没有<?>
我有一个关于Java中泛型和instanceof
运算符的问题
这是不可能使这样的检查瞬间发生的:
if (arg instanceof List<Integer>) // immposible due to
// loosing parameter at runtime
但可以运行这个:
if (arg instanceof List<?>)
现在我的问题来了-在arg instanceof List
和arg instanceof List<?>
之间有什么区别吗
# 1 楼答案
List and List < ? >
是不同的,但在本例中,当您与instanceof运算符一起使用时,它们的意思是相同的instanceof不能与泛型一起使用,因为泛型在运行时不存储任何类型信息(由于擦除实现)
这一点可以通过下面的主方法来清除。我声明了两个列表(一个是整数类型,另一个是字符串类型)。和instanceof对
List and List < ? >
的行为相同输出为:
<?> l <?> ls
在上面的主方法中,所有if语句都为true。所以很明显,在这种情况下
List and List<?>
是相同的# 2 楼答案
Java泛型是通过擦除实现的,也就是说,额外的类型信息(
<...>
)在运行时不可用,但会被编译器擦除。它有助于静态类型检查,但在运行时不起作用由于
instanceof
将在运行时而不是在编译时执行检查,因此不能在instanceof ...
表达式中检查Type<GenericParameter>
至于您的问题(您可能已经知道泛型参数在运行时不可用),在
List
和List<?>
之间没有区别。后者是一个通配符,基本上表示与不带参数的类型相同的内容。这是告诉编译器“我知道我不知道这里的确切类型”的一种方式instanceof List<?>
可以归结为instanceof List
-它们完全相同