使用不需要的超类参数覆盖方法

时间:2013-08-17 08:57:53

标签: java superclass method-overriding

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

如果您有Vector<T>,则可以在编译时将任何类型的Vector<T>传递给其add方法。这就是界面的设计方式。

因此,FourVector在这方面不是真正的Vector

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

答案 1 :(得分:0)

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

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

@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只是。方法{{1}}会以某种方式知道给定属性的确切类型。但它显然反对通用接口中通用方法的建议目的。