gpt4 book ai didi

java - 抽象父类(super class)的子类的方法可以返回父类(super class)返回类型的父类(super class)吗?

转载 作者:行者123 更新时间:2023-11-29 09:06:49 45 4
gpt4 key购买 nike

我有一个实现接口(interface)的抽象父类(super class):

public abstract class FooMatrix implements Matrix {
public Vector multiply(Vector vec) {
// Code for Matrix * Vector
}
}

public interface Matrix {
public Vector multiply(Vector vec);
}

然后我有一个子类,它扩展父类(super class)并实现第二个接口(interface),该接口(interface)表示第一个接口(interface)表示的数学类的数学子类:

public interface Vector {
// Methods
}

public class FooVector extends FooMatrix implements Vector {
@Override
public Matrix multiply(Vector rightVec) {
// Code for Vector * Vector
}
}

因此子类正在返回抽象父类(super class)的返回类型的父类(super class)。这行不通,我想知道如何让它发挥作用。

在数学中, vector 是矩阵的子类。一般来说,一个矩阵乘以一个矩阵会产生另一个矩阵。如果第二个矩阵是 vector ,则结果是 vector 。如果两个矩阵都是 vector ,则结果分别是列 vector 乘以行 vector 或行 vector 乘以列 vector 的矩阵或标量。这假设尺寸是兼容的。

我想以一种尊重数学的方式用 Java 类来表示这种行为,并尽可能提供最具体的返回类型。换句话说,我希望 fooMatrix.multiply(Vector vec) 返回 Vector,而不仅仅是 Matrix,但我希望 fooVector .multiply(Vector rightVec) 返回 Matrix 而不是 Vector (这是不正确的。)我可以将标量作为 1x1 Matrix 处理 与另一个 Vector 方法 inner 调用 multiply(Vector rightVec) 然后返回 1x1 返回 的单个元素矩阵作为标量。

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

谢谢!

最佳答案

因为 MatrixVector 处于两个不同的层次结构中。您不能使用 Matrix 代替 Vector 作为返回类型。
如果您不确定返回类型是 Matrix 还是 Vector,您可以使用由 Matrix 扩展的新接口(interface)和 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 作为返回类型,您可以返回类型为MatrixVector 的对象。

另外仅供引用 FooMatrix 不是抽象类,因为您在那里缺少 abstract 。阅读有关摘要的更多信息 http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

关于java - 抽象父类(super class)的子类的方法可以返回父类(super class)返回类型的父类(super class)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14575919/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com