带<?>或不带<?>的泛型实例

emk*_*a86 7 java generics instanceof

我对Java和instanceof运算符中的泛型有疑问.

做这样的检查实例是不可能的:

if (arg instanceof List<Integer>)  // immposible due to
                                   // loosing parameter at runtime
Run Code Online (Sandbox Code Playgroud)

但是可以运行这个:

if (arg instanceof List<?>)
Run Code Online (Sandbox Code Playgroud)


现在我的问题 - arg instanceof List 之间有什么区别arg instanceof List<?>吗?

scr*_*avy 5

Java泛型是通过擦除实现的,也就是说,附加类型信息(<...>)在运行时不可用,但是由编译器擦除.它有助于静态类型检查,但不能在运行时进行.

由于instanceof在运行时进行检查,而不是在编译的时候,你不能检查Type<GenericParameter>instanceof ...表达.

至于你的问题(你似乎已经知道泛型参数在运行时不可用),List和之间没有区别List<?>.后者是一个通配符,它​​基本上表示与没有参数的类型相同的东西.这是告诉编译器的一种方式"我知道我不知道这里的确切类型".

instanceof List<?>归结为instanceof List- 完全相同.