有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Instanceof for generic with<?>或者没有<?>

我有一个关于Java中泛型和instanceof运算符的问题

这是不可能使这样的检查瞬间发生的:

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

但可以运行这个:

if (arg instanceof List<?>)


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


共 (2) 个答案

  1. # 1 楼答案

    List and List < ? >是不同的,但在本例中,当您与instanceof运算符一起使用时,它们的意思是相同的

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

    这一点可以通过下面的主方法来清除。我声明了两个列表(一个是整数类型,另一个是字符串类型)。和instanceofList 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

    在上面的主方法中,所有if语句都为true。所以很明显,在这种情况下List and List<?>是相同的

  2. # 2 楼答案

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

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

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

    instanceof List<?>可以归结为instanceof List-它们完全相同