泛型代码中的错误扩展数字超整数?

时间:2012-09-28 13:27:30

标签: java generics point

此代码中有错误,但我不知道如何纠正它:

public class Point<T extends Number super Integer>{
}

3 个答案:

答案 0 :(得分:1)

public class Point<T extends Number>{
}

或者

public class Point<T extends Integer>{
}

你不能那样使用super。见这里:java generics super keyword

答案 1 :(得分:1)

Super仅对通配符有效,而不对命名类型参数有效。

让我们假设编译器允许这样做。只有两种类型可以说是扩展Number并且是Integer的超类型,它们是Number和Integer。

我很难看到这样做会带来什么好处,而不是带有int字段的简单非泛型Point类型。

如果真实案例涉及更多并且你想要一个可以使用双打,整数等的通用Point,当然,如果Number限制有助于避免错误,请使用T extends Number。

但是,只有T扩展数字不会让您访问+, - ,*等。您可能需要类型类模式,这涉及从泛型类型的点传递单独的操作字典创建到数字操作发生的位置。

如,

interface NumericOperations<T extends Number> {
    T plus(T x, T y);
    T subtract(T x, T y);
    T multiply(T x, T y);
    ...
}

您需要定义该类型类的实例,例如,public static final NumericOperations intOperations = new NumericOper .....;

..并在Point的方法中传递这些实例以获得加号,减号等。

答案 2 :(得分:1)

您只能将super关键字与通配符一起使用。

您应该看一下PECS原则:提供商扩展消费者超级。

super关键字用于消费者通用对象的泛型方法。

示例:

public void copyList(List<? extends Number> elementsToBeCopied, 
    List<? super Integer> listToBeFilled) {...}

备注: Integer是最终类,无法扩展,因此extends关键字无法解释。

article显示了如何使用superextends的一个很好的示例。