【发布时间】:2014-12-14 21:52:36
【问题描述】:
我目前有一个接口 Ring,它指定了加法、乘法等方法。因此,只要 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 循环,但我想知道是否有一种指定存在类型 E 的“零元素”的方法。
理想情况下,我想指定 E 有一个名为 zero() 的静态方法,因此零元素就是 E.zero()。我似乎无法找到一种方法来做到这一点。另一方面,我不能只将 zero() 方法添加到 Ring 接口,因为那样我将不得不执行类似 (new E()).zero() 之类的操作,当然不能在其中创建通用构造函数那样。有一个愚蠢的捷径,涉及像 E zero = data.get(0).zero() 之类的东西,但这似乎不是很好,只有当我已经有另一个 E 类型元素的实例漂浮在周围时才有效(这可能不是在另一种情况下是这种情况)。那么,有没有什么好的方法来指定这样一个零元素的存在,保证在任何扩展 Ring 的 E 类中实现?
【问题讨论】:
-
出于好奇,为什么默认构造函数不构造环的零?
-
@AarynTonita 如果我定义一个 BigFraction 类型的环元素(基于 BigInteger 分子和 BigInteger 分母),那么默认值是否为 0?我的理解是它们将被初始化为 null。
-
是的,但我试图建议您强制执行(作为代码的设计)默认构造函数实际构造组的零的合同?这意味着如果组不是微不足道的,那么实现组的任何人都需要实际实现构造函数,但最不意外的原则意味着您的默认构造函数不应该构造像 NaN 这样的东西。
-
@AarynTonita 从理论上讲,这对我有用,但我不知道可以使用 Java 接口对构造函数强制执行合同。你能解释一下你的意思吗?
标签: java interface static-methods