2

我有一个实现接口的抽象超类:

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不仅仅是_ _ _作为标量返回。MatrixfooVector.multiply(Vector rightVec)MatrixVectorMatrixVectorinnermultiply(Vector rightVec)Matrix

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

谢谢!

4

1 回答 1

0

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

public interface MatrixOrVector {
    // This can be used as return type
}   

更改Matrix

public interface Matrix extends MatrixOrVector{
   // Methods...
}

与矢量相同

public interface Vector extends MatrixOrVector{
    // Methods ....
}

如果MatrixOrVector用作返回类型,则可以返回类型为Matrix或的对象Vector

仅供参考FooMatrix,它不是一个抽象类,因为你在那里失踪abstract了。阅读更多关于抽象http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

于 2013-01-29T05:00:33.540 回答