Java Generics - 无限通配符中真正存在的是什么?

时间:2011-10-17 15:46:52

标签: java generics

如果我有以下代码:

public static void main(String [] args) {  
        List <Integer> l2 = new ArrayList <Integer>();  
        List <?> l3 = l2;  
        test(l2);  
        test(l3);  
}  


public static void test(List <?> l) {  
        if (l instanceof List<?>)  
            System.out.println("true");  
}  

这将打印:

true  
true  

根据我的理解,<?>是一个可重复的类型,这意味着它有一些捕获类型(无论那种类型)在运行时可用。

问题:
一个。在测试方法中,是否知道l2具有整数类型(因为它在方法调用之前已被擦除)?它是如何翻译的,以便l(来自l2)是List&lt;?&gt;?的实例 湾l3怎么样?它是如何翻译的?

2 个答案:

答案 0 :(得分:8)

我不相信<?>已经具体化了。它只是在不使用原始表单(List)的情况下引用泛型类型的唯一方法。在这两种情况下,您只需执行与以下操作完全相同的操作:

if (l instanceof List) 
   ...

修改

事实上,我刚刚确认,无论您在List<?>中使用List还是instanceof,它们都会生成完全相同的字节码。

答案 1 :(得分:3)

无界通配符只能在运行时没有丢失类型信息,因为没有类型信息丢失。至于你的问题:

一个。测试方法知道l2具有Integer类型。对于测试方法,它是一个包含“东西”的列表,而这就是全部。

湾没有“翻译”。它只是一个无限类型的列表,作为参数传递给一个采用无界类型列表的方法。

相关问题