用于泛型的 <?> 或不带 <?>

问题描述 投票:0回答:3

我有一个关于 Java 中的泛型和

instanceof
运算符的问题。

不可能进行这样的instanceof check

if (arg instanceof List<Integer>)  // immposible due to
                                   // loosing parameter at runtime

但是可以运行这个:

if (arg instanceof List<?>)


现在我的问题来了 -

arg instanceof List
arg instanceof List<?>
之间有什么区别吗?

java generics instanceof
3个回答
7
投票

Java 泛型是通过erasure实现的,即附加类型信息(

<...>
)在运行时将不可用,而是被编译器擦除。它有助于静态类型检查,但不能在运行时进行。

由于

instanceof
将在运行时而不是编译时执行检查,因此您无法在
Type<GenericParameter>
表达式中检查
instanceof ...

至于你的问题(你可能似乎已经知道通用参数在运行时不可用)

List
List<?>
之间没有区别。后者是一个通配符,基本上表达与不带参数的类型相同的内容。这是告诉编译器“我知道我不知道这里的确切类型”的一种方式。

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


2
投票

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<?>
是相同的。


0
投票

Я думаю что это может быть решением

if(nums.get(0) instanceof Integer) {}
else if(nums.get(0) instanceof Double) {}

Конечно, если мы знаем что под всеми индексами точно один и тот же тип, а не в перемешку.

© www.soinside.com 2019 - 2024. All rights reserved.