我目前有一个接口(interface) Ring,它指定了加法、乘法等方法。因此,我可以制作一类其元素为 E 类型的 vector ,只要 E 扩展 Ring,它就有加法、点积等。例如,一个非常简单的类可能看起来像
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()。我似乎想不出办法来做到这一点。另一方面,我不能只向 Ring 接口(interface)添加一个 Zero() 方法,因为那样我就必须做类似 (new E()).zero() 的事情,当然,不能在中创建通用构造函数那样。有一个愚蠢的捷径涉及类似 E Zero = data.get(0).zero() 的东西,但这看起来不太好,只有当我已经有另一个 E 类型元素的实例 float 时才有效(这可能不会)在另一种情况下也是如此)。那么,有没有什么好的方法来指定这样一个零元素的存在,并保证在任何扩展 Ring 的类 E 中实现?
最佳答案
您不能要求实现类具有静态方法。我建议您不要重复使用像 Vector
这样的常见内置类名称,因为它会导致困惑。
如果您对构造有重要要求,我建议您使用工厂方法来创建实例。在您的情况下,您可以指定 E
有一个方法 zero()
即使它不是静态的。问题是您必须传递该类或该类的实例作为参数。方法/构造函数不知道调用它时使用了什么泛型,并且它们必须是参数。
关于java - 如何指示一个类将具有特定的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27474560/