我实例化以下列表:
// I am just revising generics again and the following is just cursory code!
List<? super Integer> someList = new ArrayList<Object>();
someList.add(new Object());
上面的方法不起作用。我收到编译器错误。但是,以下工作原理:
List<? super Integer> someList = new ArrayList<Object>();
someList.add(11);
我知道您可以将对象添加到包含 无限制 通配符而不是有界通配符的集合中。
但是,为什么上述方法不起作用?对象是整数的超类型,所以为什么不能添加它?
那声明它是一个列表的东西,是Integer的超类型,而不是列表可以包含任何东西,它们是Integer的超类型。换句话说,对于编译器来说,它可能是a
List<Integer>
,a List<Number>
或a
List<Object>
,但是它不知道哪个,因此您不能只向List添加任何内容。您唯一可以安全添加的是Integer,因为可以保证它是List可能包含的任何类型的子类型。
换句话说,?
表示 一种 类型,而不是 任何 类型。这是一个不明显但重要的区别。
问题内容: 您好直接从Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html提供的Java教程中 我知道编译时的类型擦除。而且我也知道,一个类型(无界)将被Object取代。知道在编译时如何使用无界通配符进行编译吗?只是删除它,因为它是原始类型? 提前致谢。 问题答案: 假设我们有一个
问题内容: 我有一个接口将对象转换为字符串: 以及用于存储所有可用转换器的地图: 现在,我有了要转换的异构数据列表,如下所示: 但是此代码无法编译: 我应该如何更改代码? 问题答案: 您面临的问题称为通配符捕获。Java无法识别将从数据中接收的类型。尝试以两种方式中的任何一种重构代码 方法1:如下 更改您的界面 方法2: 通过类型推断来捕获通配符的Helper方法 创建如下的帮助方法, 如下调用此
根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者
我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?
null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。
问题内容: 为什么此代码无法编译(是接口)? 问题答案: 这样做是出于安全考虑。想象一下它是否有效: 含义是“ the是扩展了某种类型的列表Parent。我们不知道哪种类型-它可能是,或。” 这使得它的安全抓取任何物品出来的的,从API和转换T到Parent,但它不是安全地调用中的从转换到......因为转换可能是无效的。