インターフェイスを実装する抽象スーパークラスがあります。
public abstract class FooMatrix implements Matrix {
public Vector multiply(Vector vec) {
// Code for Matrix * Vector
}
}
public interface Matrix {
public Vector multiply(Vector vec);
}
次に、スーパー クラスを拡張し、最初のインターフェイスによって表される数学クラスの数学サブクラスを表す 2 番目のインターフェイスを実装するサブクラスがあります。
public interface Vector {
// Methods
}
public class FooVector extends FooMatrix implements Vector {
@Override
public Matrix multiply(Vector rightVec) {
// Code for Vector * Vector
}
}
したがって、サブクラスは、抽象スーパー クラスの戻り値の型のスーパー クラスを返します。これは機能していません。どうすれば機能させることができるか知りたいです。
数学では、ベクトルは行列のサブクラスです。一般に、行列に行列を掛けると、別の行列が生成されます。2 番目の行列がベクトルの場合、結果はベクトルになります。両方の行列がベクトルの場合、結果はそれぞれ、列ベクトルに行ベクトルを掛けた行列またはスカラーになります。行ベクトルに列ベクトルを掛けたものです。これは、寸法に互換性があることを前提としています。
数学を尊重し、可能な限り具体的な戻り値の型を与える方法で、この動作を Java クラスで表現したいと思います。言い換えると、だけでなく を返したいfooMatrix.multiply(Vector vec)
のですが、 を返したくありません(これは正しくありません)。別のメソッドを使用してスカラーを 1x1 として処理し、1x1の単一要素を呼び出して返すことができます。スカラーとして返します。Vector
Matrix
fooVector.multiply(Vector rightVec)
Matrix
Vector
Matrix
Vector
inner
multiply(Vector rightVec)
Matrix
共変の戻り値の型に関する質問を見つけましたが、このようなものはありません。
ありがとう!