我有一个关于 Java 中的泛型和
instanceof
运算符的问题。if (arg instanceof List<Integer>) // immposible due to
// loosing parameter at runtime
但是可以运行这个:
if (arg instanceof List<?>)
现在我的问题来了 -
arg instanceof List
和arg instanceof List<?>
之间有什么区别吗?
Java 泛型是通过erasure实现的,即附加类型信息(
<...>
)在运行时将不可用,而是被编译器擦除。它有助于静态类型检查,但不能在运行时进行。
由于
instanceof
将在运行时而不是编译时执行检查,因此您无法在 Type<GenericParameter>
表达式中检查 instanceof ...
。
至于你的问题(你可能似乎已经知道通用参数在运行时不可用)
List
和List<?>
之间没有区别。后者是一个通配符,基本上表达与不带参数的类型相同的内容。这是告诉编译器“我知道我不知道这里的确切类型”的一种方式。
instanceof List<?>
归结为 instanceof List
- 完全相同。
List and List < ? >
不一样,但在这种情况下,当您与 instanceof 运算符一起使用时,它们的含义相同。
instanceof 不能与泛型一起使用,因为泛型在运行时不存储任何类型信息(由于擦除实现)。
这一点可以通过下面的 main 方法清除。我声明了两个列表(一个是整数类型,另一个是字符串类型)。 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 语句都为 true。很明显,在这种情况下
List and List<?>
是相同的。
Я думаю что это может быть решением
if(nums.get(0) instanceof Integer) {}
else if(nums.get(0) instanceof Double) {}
Конечно, если мы знаем что под всеми индексами точно один и тот же тип, а не в перемешку.