2

インターフェイスを実装する抽象スーパークラスがあります。

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の単一要素を呼び出して返すことができます。スカラーとして返します。VectorMatrixfooVector.multiply(Vector rightVec)MatrixVectorMatrixVectorinnermultiply(Vector rightVec)Matrix

共変の戻り値の型に関する質問を見つけましたが、このようなものはありません。

ありがとう!

4

1 に答える 1

0

MatrixVectorは 2 つの異なる階層にあるためです。戻り型としてMatrix代わりに使用することはできません。 戻り値の型が 型か かどうかわからない場合は、によって拡張された新しいインターフェイスを使用して、それを戻り値型として使用できます。 やや好き Vector
MatrixVectorMatrixVector

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

Matrixに 変更

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

ベクトルと同じ

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

戻り値の型として使用すると、またはMatrixOrVector型のオブジェクトを返すことができます。MatrixVector

また、参考までに、そこFooMatrixに欠けているため、抽象クラスではありませんabstract。アブストラクトについて詳しく読むhttp://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

于 2013-01-29T05:00:33.540 に答える