我目前有一个接口Ring,它指定add,multiply等方法。因此,只要E扩展Ring,我就可以制作一类其元素为E类的向量,它具有加法,点积等。例如,一个非常简单的类可能看起来像
public class Vector<E extends Ring<E>> {
List<E> data;
public Vector() {
// constructor implementation here
}
public E dot(Vector<E> other) {
// initialize ``result" somehow
for (int index=0; index<data.size(); index++) {
result.add(data.get(index).multiply(other.get(index)));
}
return result;
}
}
在这个简单的例子中,人们可以简单地将结果初始化为data.get(0).multiply(other.get(0)),然后在1处开始for循环,但是我想知道是否有一种方法可以指定有一个“零元素”#34;类型E。
理想情况下,我想指定E有一个名为zero()的静态方法,以便零元素只是E.zero()。我似乎无法找到一种方法来做到这一点。另一方面,我不能只将一个零()方法添加到Ring接口,因为那时我必须做一些像(new E())。zero(),当然一般的构造函数不能以这种方式制作。有一个愚蠢的快捷方式涉及像E zero = data.get(0).zero()这样的东西,但这似乎不太好,只有当我已经有一个E型元素的另一个实例浮动时才有效(这可能不会在另一种情况下就是这种情况)。那么,有没有很好的方法来指定这样一个零元素的存在,保证在扩展Ring的任何类E中实现?
答案 0 :(得分:0)
您不能要求实现类具有静态方法。我建议你不要重用像Vector
这样的常见内置类名,因为它会导致混淆。
如果您对构造有一个非常重要的要求,我建议您使用Factory方法来创建实例。在您的情况下,您可以指定E
具有方法zero()
,即使它不是静态的。问题是您必须将类或该类的实例作为参数传递。方法/构造函数不知道在调用它时使用的泛型,它们必须是参数。