在Java中,协方差允许API设计人员指定实例可以概括为某种类型或该类型的子类型中的任何一种。例如:
List<? extends Shape> shapes = new ArrayList<Circle>();
// where type Circle extends Shape
相反,则相反。它允许我们指定实例可以被概括为某种类型或超类型。
List<? super Shape> shapes = new ArrayList<Geometry>();
// where Shape extends Geometry
Java泛型的矛盾性如何有用?您何时选择使用它?
好吧,您的第二个示例将允许您编写:
Shape shape = getShapeFromSomewhere();
shapes.add(shape);
而您无法使用第一种形式执行此操作。它不会像协方差那样有用,我将授予您。
在比较方面,它 可能 是有用的一个领域。例如,考虑:
class AreaComparer implements Comparator<Shape>
...
您可以使用它来比较 任意 两个形状…因此,如果我们也 可以 使用它来对a
List<Circle>
进行排序,那将是很好的。幸运的是,我们可以使用逆方差来做到这一点,这就是为什么存在以下原因的重载Collections.sort
:
public static <T> void sort(List<T> list, Comparator<? super T> c)
问题内容: 我有一个简单的示例,它似乎应该工作: 因此,我们有一个名为的类,它符合协议,并定义了一个可选的类方法。 但是,这一行: 导致错误: 类型名称后的预期成员名称或构造函数调用 知道我在做什么错吗? 编辑 从声明中删除单词并稍微更改函数可以使代码得以编译,但是现在我遇到了运行时错误,指出 “快速动态投放失败” 问题答案: 我无法解释为什么您的代码会导致运行时异常。但是,如果您更改函数原型,它
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
问题内容: 这是来自 HeadFirst Java的 :(第575页) 这个: 做与此相同的事情: 所以这是我的问题:如果它们完全相同,我们为什么不写 要么 另外,什么时候使用?是有用的?而不是使用泛型的方法声明(如上所述)中的T或用于类声明?有什么好处? 问题答案: 之间的最大区别 和 是在前一种方法中,您可以在方法中将“ T”作为给出的具体类。在第二种方法中,您无法执行此操作。 这里有一个更复
无法从自定义类获取泛型类型列表(Turns): 它说:
这将无法编译,因为编译器只能保证是的某个子类,但不能保证的每个子类都将重写以返回自身的数组,就像我碰巧对所做的那样,因此Java只知道返回而不是。 我如何保证每个子类都用一个协变返回类型重写,以便我可以将它与泛型一起使用?
问题内容: 我使用,在我的应用程序中添加了易于阅读的配置文件,并试图在该文件周围添加包装器,以简化类型转换。具体来说,我希望返回的值从提供的默认值开始“继承”它的类型。到目前为止,这是我得到的: (完整示例来源。) 不管是否从属性文件中读取返回值,from的返回值都是一个布尔值,对于字符串,整数,双精度数和&c而言,返回值都类似。当然,上面的代码片段实际上并没有编译: 我做错了吗,还是我只是试图做