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

时间:2013-01-29 04:57:10

标签: java interface subclass abstract superclass

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

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)作为标量返回。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

因为MatrixVector位于两个不同的层次结构中。您无法使用Matrix代替Vector作为返回类型 如果您不确定返回类型是否为MatrixVector类型,则可以使用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。阅读有关abstract http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

的更多信息