2013-10-11 34 views
1

代码:通配符,它​​是如何工作的?

List<? extends Integer> ints= new ArrayList<Integer>(); 
ints.add(3);//error 

我仍然不明白它是如何工作的。 问题:

是什么意思CAP#1?它是参考类型吗?我认为,不,因为CAP#1不从Object继承。我们可以写ints.add(null);//OK并且我们没有编译时错误。但我们不能写null instanceof CAP#1;//compile-time error。为什么我们不能实例化CAP#1

CAP#1 c= new CAP#1(); 

CAP#1看到了什么?

+0

[无法将一个ModuleInfo对象添加到ArrayList <?扩展ModuleInfo>](http://stackoverflow.com/questions/13499928/cant-add-a-moduleinfo-object-to-arraylist-extends-moduleinfo) –

+0

@Rohit Jain我有以下问题:编译器是否知道方法'布尔添加(?扩展整数)'参数的类型'?扩展了由“CAP#1”定义的Integer,其中CAP#1在这种情况下是一种特殊类型,可能只有一个实例 - null?这个问题是否正确?如果正确,请回答。 –

回答

4

CAP#1是编译器的由“?”所代表的隐式类型变量名。没有这种命名类型,但编译器需要为该类型创建一个占位符以完成其工作。该名称代表“捕获”。

它有助于精神上重写一个类型如G<? extends T>∃CAP#1 extends T: G< CAP#1 >

由于不知道通配符代表什么,因此不能使用通配符扩展类型将任何内容添加到列表中。就像您不能将Snake添加到List<Mammal>一样,您无法将其添加到List< ? extends Animal >,因为该?可能代表Mammal

你可以,但是,总是在这种情况下添加null因为null是有效每个引用类型,其中必然包括无论?可能可能代表中的一员。

我经常想知道为什么Java不会将List< ? extends F >作为最终类型FList<F>相同。也许这是因为F本身可能是一个通用的通配符类型,这意味着它仍然会有任意多的子类型。

除了Angelika Langer着名的关于Java泛型的常见问题,我一直在编辑关于他们的some things在我自己的列表中。

+0

_CAP#1是由'?'表示的隐式类型变量的编译器名称_什么意思是隐式类型?编译器是否知道对于所有隐式类型,我们只有一个这样的实例?它是'空'。我认为,这不是事实。因为如果我们考虑使用'super'的通配符,我们也有隐式类型:'List <? super Integer> ints = new ArrayList (); ints.add(“dsd”); //编译错误整数。add(4); // ok' –

+0

你应该总是阅读一个通配符类型,比如'G 'as&exists; 'S扩展T:G < S >'。关于编译器w.r.t的行为超级,查找“PECS”(制片人延伸,超级消费者)。 –

+0

'∃CAP#'n'延伸T:G < CAP#'n '>' –

相关问题