繁体   English   中英

抽象超类的子类的方法可以返回超类的超类返回类型吗?

[英]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 Matrixinner还有另一个Vector方法,该方法调用multiply(Vector rightVec) ,然后将1x1的单个元素作为标量返回Matrix

我发现了有关协变返回类型的问题,但没有这样的问题。

谢谢!

因为MatrixVector在两个不同的层次结构中。 您不能使用Matrix代替Vector作为返回类型。
如果不确定返回类型是Matrix还是Vector ,则可以新建由MatrixVector扩展的接口,并将其用作返回类型。
有点像

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作为返回类型,则可以返回MatrixVector类型的对象。

同样,FYI FooMatrix不是抽象类,因为您在那里缺少abstract 阅读有关抽象的更多信息http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM