带有<! - ? - >或没有<! - ? - >的泛型实例

时间:2013-01-26 08:59:19

标签: java generics instanceof

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

制作这样的 instanceof check

是不可能的
if (arg instanceof List<Integer>)  // immposible due to
                                   // loosing parameter at runtime

但是可以运行这个:

if (arg instanceof List<?>)


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

2 个答案:

答案 0 :(得分:5)

Java Generics由 erasure 实现,也就是说,附加类型信息(<...>)在运行时将不可用,但会被编译器删除。它有助于静态类型检查,但不能在运行时进行检查。

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

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

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

答案 1 :(得分:2)

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

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

这一点通过以下主方法清除。我已经声明了两个列表(一个是Integer类型,另一个是String类型)。 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<?>是相同的。