0

我有一个来自我在项目中使用的库的接口 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) {
   ...
   }
}

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

4

2 回答 2

1

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

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

  • 要么你接受,不实施Vector
  • 或者您可以添加运行时检查:if (!(v instanceof FourVector)) throw new UnsupportedOperationException("Only FourVector allowed here");
于 2013-08-17T09:09:14.110 回答
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>());
}

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

于 2013-08-17T10:24:22.327 回答