如果我有以下代码:
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怎么样?它是如何翻译的?
答案 0 :(得分:8)
我不相信<?>
已经具体化了。它只是在不使用原始表单(List
)的情况下引用泛型类型的唯一方法。在这两种情况下,您只需执行与以下操作完全相同的操作:
if (l instanceof List)
...
事实上,我刚刚确认,无论您在List<?>
中使用List
还是instanceof
,它们都会生成完全相同的字节码。
答案 1 :(得分:3)
无界通配符只能在运行时没有丢失类型信息,因为没有类型信息丢失。至于你的问题:
一个。测试方法不知道l2具有Integer类型。对于测试方法,它是一个包含“东西”的列表,而这就是全部。
湾没有“翻译”。它只是一个无限类型的列表,作为参数传递给一个采用无界类型列表的方法。