4

Java でいくつかの基本的な数学的概念を定義しようとしていますが、ジェネリック エラーが発生し続けています。以下の例を考えてみましょう。この例では、ゼロ マッピング(すべての x に対して f(x) = 0) を定数マッピング(すべての x に対して f(x) = c) と線形マッピング(f(a*x + b*y) = a*f(x) + b*f(y))。「ゼロマッピングはベクトルです」というステートメントがあいまいであるため、コンパイラはそれを許可しません(Javaに関しては、数学的にはそうではありません)。

この問題に対する明確な解決策を提案できますか?

// A vector in a finite-dimensional vector space over the real numbers.
interface Vector<V extends Vector<?>>
{
    int dimension();
    V plus(V v);
    V times(double c);
}

interface Mapping<U extends Vector<?>, V extends Vector<?>>
// Does not inherit from Vector because the set of all mappings is an
// infinite-dimensional vector space.
{
    V map(U u);
}

// Linear mappings, on the other hand, from one finite-dimensional vector space
// to another, do form a finite-dimensional vector space.
interface LinearMapping<U extends Vector<?>, V extends Vector<?>>
    extends Mapping<U, V>, Vector<LinearMapping<U, V>>
{
}

// All elements of U are mapped to getImage(). If V is finite-dimensional, then
// the set of constant mappings is also a finite-dimensional vector space.
interface ConstMapping<U extends Vector<?>, V extends Vector<?>>
    extends Mapping<U, V>, Vector<ConstMapping<U, V>>
{
    V getImage();
}

// A zero mapping is both constant and linear, but cannot be defined as such.
interface ZeroMapping<U extends Vector<?>, V extends Vector<?>>
    extends LinearMapping<U, V>, ConstMapping<U, V>
// Error: The interface Vector cannot be implemented more than once with
// different arguments: Vector<ConstMapping<U,V>> and Vector<LinearMapping<U,V>>
{
}
4

1 に答える 1

3

問題は、ZeroMapping が と の両方Vector<LinearMapping>を拡張しているようVector<ConstMapping>です。

これを修正するために、 と のジェネリック パラメータ V を個々のクラスの下限に変更して、ジェネリックLinearMappingConstMapping拡張Vector<V>できるようにし、柔軟性を高めます。うまくいけば、これは LinearMapping を Mapping と Vector (それ自体のみ) の両方にするというあなたの意図を捉えています。

EDIT : その場合、3 つの一般的なパラメーターを使用する必要がある場合があります。2 つは "Mapping" をキャプチャするため、1 は同じタイプの他の LinearMappings との "Vector" 関係をキャプチャするためです。

次に、ZeroMapping は同じ形式に従います。

以下の応答に @LuiggiMendoza の提案を含めました。

interface Vector<V extends Vector<V>>
{
    int dimension();
    V plus(V v);
    V times(double c);
}

interface Mapping<U extends Vector<U>, V extends Vector<V>>
// Does not inherit from Vector because the set of all mappings is an
// infinite-dimensional vector space.
{
    V map(U u);
}

// Linear mappings, on the other hand, from one finite-dimensional vector space
// to another, do form a finite-dimenszional vector space.
interface LinearMapping<U extends Vector<U>, V extends Vector<V>, W extends LinearMapping<U, V, W>>
    extends Mapping<U, V>, Vector<W>
{
}

// All elements of U are mapped to getImage(). If V is finite-dimensional, then
// the set of constant mappings is also a finite-dimensional vector space.
interface ConstMapping<U extends Vector<U>, V extends Vector<V>, W extends ConstMapping<U, V, W>>
    extends Mapping<U, V>, Vector<W>
{
    V getImage();
}

// A zero mapping is both constant and linear, but cannot be defined as such.
interface ZeroMapping<U extends Vector<U>, V extends Vector<V>, W extends ZeroMapping<U, V, W>>
    extends LinearMapping<U, V, W>, ConstMapping<U, V, W>
{
}

クラスの実装方法の例は次のとおりです。

class RealVector implements Vector<RealVector> { // methods here .. // }

class RealLinearMapping implements LinearMapping<RealVector, RealVector, RealLinearMapping>
{
    @Override
    public RealVector map(RealVector u) { ... }

    @Override
    public RealLinearMapping plus(RealLinearMapping v) { ... }
}
于 2013-05-26T14:08:00.067 に答える