我有一个来自我在项目中使用的库的界面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) {
...
}
}
有一些模式或解决方法可以实现这个想法吗?
答案 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}}会以某种方式知道给定属性的确切类型。但它显然反对通用接口中通用方法的建议目的。