8

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

进行这样的instanceof 检查是不可能的:

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

但可以运行这个:

if (arg instanceof List<?>)


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

4

2 回答 2

6

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

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

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

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

于 2013-01-26T09:00:49.297 回答
2

List and List < ? >不一样,但在这种情况下,当您使用instanceof运算符时,它们的含义相同。

instanceof不能与泛型一起使用,因为泛型在运行时不存储任何类型信息(由于擦除实现)。

这一点可以通过以下主要方法清除。我已经声明了两个列表(一个是整数类型,另一个是字符串类型)。并且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<?>是相同的。

于 2013-01-26T09:17:19.137 回答