这段代码有一个错误,但我不知道如何纠正它:
public class Point<T extends Number super Integer>{
}
Super 仅对通配符有效,对命名类型参数无效。
让我们想象一下编译器允许这样做。只有两种类型可以说是对 Number 的扩展并且是 Integer 的超类型,它们是 Number 和 Integer。
我很难看到这样做会带来什么好处,而不是直接使用带有 int 字段的非泛型 Point 类型。
如果实际情况更复杂,并且您想要一个可以使用双精度、整数等的通用 Point,当然,如果 Number 限制有助于避免错误,请使用 T extends Number。
但是,仅使用 T extends Number 并不能让您访问 +、-、* 等。您可能需要类型类模式,这涉及从创建泛型类型的点传递一个单独的操作字典到数字运算发生的地方。
例如,
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的方法中传递这些实例以获取加号、减号等。
public class Point<T extends Number>{
}
或这个
public class Point<T extends Integer>{
}
你不能这样用super
。见这里:java泛型超级关键字
您只能将super
关键字与通配符一起使用。
你应该看看PECS原理:Provider Extends Consumer Super。
super 关键字用于消费者泛型对象的泛型方法中。
例子 :
public void copyList(List<? extends Number> elementsToBeCopied,
List<? super Integer> listToBeFilled) {...}
备注: Integer
是final类,不能扩展,所以extends
关键字不适用。
这篇文章展示了一个很好的例子,说明如何super
以及extends
可以使用。