List<Integer> li4 = new ArrayList<Integer>();
li4.add(new Integer(5));
Integer myInt4 = li4.get(0);
List<? extends Integer> li = new ArrayList<Integer>();
Integer myInt = li.get(0);
li = li4;
li.add(new Integer(5));
Error(24,9): cannot find method add(java.lang.Integer)
<代码>?extends Integer并不意味着“应该允许任何扩展Integer的类型”。这意味着这是一个列表
,用于某些扩展integer的特定t
。
那么您从列表中得到了什么?extends integer>
将扩展integer
,但是不能只放入任何内容--我们不知道要放入的类型是否匹配T
。
举一个具体的例子,integer
扩展number
。这样你就可以写
List<? extends Number> list1 = new ArrayList<Integer>();
List<? extends Number> list2 = new ArrayList<Double>();
问题内容: 我不确定以下代码中的最后一条语句为何非法。应该是的子类型,那么为什么不能将其分配给? 问题答案: 关键是指向 某种 类型的列表,但是编译器不知道该类型是什么,因此它不 知道 向其添加类型是否有效。举个例子,这也是一件好事- 您将向最初创建的用于保存字符串列表的对象添加一个。当然,这些信息在Java执行时会丢失-但是编译器会尽力确保您的安全。 见Java泛型常见问题解答了 很多 的更多信
问题内容: 这是来自 HeadFirst Java的 :(第575页) 这个: 做与此相同的事情: 所以这是我的问题:如果它们完全相同,我们为什么不写 要么 另外,什么时候使用?是有用的?而不是使用泛型的方法声明(如上所述)中的T或用于类声明?有什么好处? 问题答案: 之间的最大区别 和 是在前一种方法中,您可以在方法中将“ T”作为给出的具体类。在第二种方法中,您无法执行此操作。 这里有一个更复
问题内容: 我对Java中的通用通配符有两个疑问: 和之间有什么区别? 什么是有界通配符,什么是无界通配符? 问题答案: 在你的第一个问题中,并且是有界通配符的示例。无限制的通配符看起来像,基本上就是<? extends Object>。宽松地表示泛型可以是任何类型。有界通配符(或)通过说它必须扩展特定类型(称为上限)或必须是特定类型的祖先(称为下限)来对类型进行限制。
所以我在阅读泛型以重新熟悉这些概念,尤其是在涉及通配符的地方,因为我很少使用或遇到通配符。从我的阅读中,我不明白他们为什么使用通配符。下面是我经常遇到的一个例子。 你为什么不这样写: oracle网站上的另一个示例: 为什么这不是写成 我错过什么了吗?
问题内容: 我试图了解类泛型的工作原理,这对我来说毫无意义。 因此,例如,如果我有以下课程: 然后我尝试 go方法不应该接受A或A的任何子类吗? 谢谢 :) 问题答案: 这样做的原因是基于Java如何实现泛型的。 数组示例 使用数组可以做到这一点(数组是协变的,正如其他人解释的那样) 但是,如果您尝试这样做会发生什么? 最后一行可以正常编译,但是如果您运行此代码,则可能会得到一个。因为您正在尝试将
问题内容: 阅读Java在线教程,我对通配符捕获一无所知。例如: 为什么编译器无法保留分配的安全性?它知道,例如,通过执行带有整数列表的方法,它可以从i.get中获取一个整数值。因此,它尝试将索引0处的Integer值设置为相同的Integer列表(i)。那么,怎么了?为什么要编写通配符助手? 问题答案: 为什么编译器无法保留分配的安全性? 编译器不知道 任何 关于类型中的元素通过定义。通配符并