[英]Can a method of a subclass of an abstract super class return a super class of the super class return type?
我有一个实现接口的抽象超类:
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
, inner
还有另一个Vector
方法,该方法调用multiply(Vector rightVec)
,然后将1x1的单个元素作为标量返回Matrix
。
我发现了有关协变返回类型的问题,但没有这样的问题。
谢谢!
因为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
。 阅读有关抽象的更多信息http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.