【问题标题】:How do you indicate that a class will have a particular static method?你如何表明一个类将有一个特定的静态方法?
【发布时间】: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


【解决方案1】:

您不能要求实现类具有静态方法。我建议您不要重用像 Vector 这样的常见内置类名称,因为它会导致混淆。

如果您对构造有重要要求,我建议您使用工厂方法来创建实例。在您的情况下,您可以指定 E 有一个方法 zero() 即使它不是静态的。问题是您必须将类或该类的实例作为参数传递。方法/构造函数不知道您在调用它时使用了哪些泛型,它们必须是参数。

【讨论】:

  • 啊,是的,Vector 类只是这篇文章的一个例子。真的,我想要做的是将行列式方法添加到表示 E 类型的稀疏矩阵的类中。由于稀疏矩阵仅跟踪非零条目,如何指示仅由零组成的矩阵的行列式(即“空”稀疏矩阵)为零?在这种情况下,将没有对象可以调用 zero() 方法。
  • 您可以有一个ZeroProvider&lt;E&gt; 接口,它为您提供该类的 zero() 对象。您可以使用 Enum 来实现它。
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2017-07-17
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多