【问题标题】:Override method with unwanted superclass argument用不需要的超类参数覆盖方法
【发布时间】:2013-08-19 16:00:21
【问题描述】:

我有一个来自我在项目中使用的库的接口 Vector,但我无法修改...

interface Vector<T> {
   public Vector<T> plus(Vector<T> v);
}

然后我用一个类 FourVector 实现了它,但问题出现在覆盖方法 plus 上。我想要FourVector 只能添加FourVector,而不是所有类型的Vector!我尝试做的是这样的事情(但显然是错误的)

class FourVector<T> implements Vector<T> {
   public Vector<T>  plus(FourVector<T> v) {
   ...
   }
}

有一些模式或解决方法可以实现这个想法吗?

【问题讨论】:

  • 那么 FourVector 是 4 维向量吗?如果是这样,当您向其中添加 2D 向量时,您如何知道要添加到哪些维度?
  • 是的,它代表 Minkowski 4 维向量。事实上,我想防止这种类型的覆盖方法不一致......

标签: java superclass overriding


【解决方案1】:

我会改进第一个正确的评论。

另一方面,您可以通过以下方式覆盖方法:

@Override
public FourVector<T> plus(Vector<T> v) {
    return null;
}

您需要意识到接口是使用签名定义的。您还需要意识到您建议的行为会非常令人困惑。看看下面的代码:

public void a() {
    Vector<T> vector = new FourVector<>();
    b(vector);
}

public void b(Vector<T> v) {
    v.plus(new ThreeVector<T>());
}

开发人员怎么会知道即使属性是Vector 在方法b 中的类型,它实际上也是FourVector,并且方法plus 只接受FourVector。方法b 会以某种方式知道给定属性的确切类型。但这显然违背了泛型接口中泛型方法的建议目的。

【讨论】:

    【解决方案2】:

    如果您有Vector&lt;T&gt;,您将能够在编译时将任何类型的Vector&lt;T&gt; 传递给它的add 方法。界面就是这样设计的。

    所以你的FourVector 在这方面不是真正的Vector

    • 要么你接受这一点并且不实施Vector
    • 或者您可以添加运行时检查:if (!(v instanceof FourVector)) throw new UnsupportedOperationException("Only FourVector allowed here");

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2016-01-02
      • 1970-01-01
      • 2011-12-13
      • 2013-11-02
      相关资源
      最近更新 更多