我有一个实现接口的抽象超类:
public abstract class FooMatrix implements Matrix {
public Vector multiply(Vector vec) {
// Code for Matrix * Vector
}
}
public interface Matrix {
public Vector multiply(Vector vec);
}
然后我有一个扩展超类的子类,并实现了第二个接口,它表示第一个接口所代表的数学类的数学子类:
public interface Vector {
// Methods
}
public class FooVector extends FooMatrix implements Vector {
@Override
public Matrix multiply(Vector rightVec) {
// Code for Vector * Vector
}
}
因此子类返回抽象超类的返回类型的超类。这不起作用,我想知道如何使它发挥作用。
在数学中,向量是矩阵的子类。矩阵乘以矩阵通常会产生另一个矩阵。如果第二个矩阵是向量,则结果是向量。如果两个矩阵都是向量,则结果分别是列向量乘以行向量或行向量乘以列向量的矩阵或标量。这假设尺寸是兼容的。
我想以尊重数学的方式用Java类来表示这种行为,并提供最具体的返回类型。换句话说,我希望fooMatrix.multiply(Vector vec)
返回Vector
,而不只是Matrix
,但我希望fooVector.multiply(Vector rightVec)
返回Matrix
而不是Vector
(这是不正确的。)我可以将标量作为1x1 Matrix
与另一个调用Vector
的{{1}}方法inner
处理,然后返回1x1的单个元素将multiply(Vector rightVec)
作为标量返回。
我找到了有关协变返回类型的问题,但没有这样的。
谢谢!
答案 0 :(得分:0)
因为Matrix
和Vector
位于两个不同的层次结构中。您无法使用Matrix
代替Vector
作为返回类型
如果您不确定返回类型是否为Matrix
或Vector
类型,则可以使用Matrix
和Vector
扩展的新界面并使用它作为返回类型。
有点像
public interface MatrixOrVector {
// This can be used as return type
}
将Matrix
更改为
public interface Matrix extends MatrixOrVector{
// Methods...
}
与Vector
相同public interface Vector extends MatrixOrVector{
// Methods ....
}
如果使用MatrixOrVector
作为返回类型,则可以返回Matrix
或Vector
类型的对象。
同样只是FYI FooMatrix
不是抽象类,因为你在那里缺少abstract
。阅读有关abstract http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html