2

私は次のインターフェースを持っています

public interface Group {
    public Group add(Group g);
    public Group sub(Group g);
    public Group getAddInv();
    public boolean isZero();
}

public interface Ring extends Group {
    public Ring mul(Ring r);
    public boolean isOne();
}

ここで、これらのインターフェイスを汎用にして、同じ代数的構造の要素に対してのみメソッドを呼び出せるようにします。

たとえば、Ringの2つの要素を追加することは可能ですが、Groupの1つの要素とRingの1つの要素を追加することはできません。

私の最初の考えは<?グループのメソッドのスーパーリング>ですが、うまくいきませんでした。どうすればこれを達成できますか?

アップデート:

public interface Group<T> {
    public T add(T g);
    public T sub(T g);
    public T getAddInv();
    public boolean isZero();
}

public interface Ring<T> extends Group<Ring<T>> {
    public T mul(T r);
    public boolean isOne();
}

それは解決策でしょうか?

4

3 に答える 3

4

次のようになります。

public interface Group<T> {
    public T add(T g);
    public T sub(T g);
    public T getAddInv();
    public boolean isZero();
}

public interface Ring<T> extends Group<T> {
    public T mul(T r);
    public boolean isOne();
}

実際の実装では、これらのインターフェイスをそれ自体の型パラメーターで実装します。

class MyInteger implements Ring<MyInteger>
于 2012-12-12T21:22:06.003 に答える
1

私は型システムを介してこれを行おうとはしません。まず、すでに述べたように、インターフェイスはかなり奇妙に見えます(あるグループを別のグループに追加するとはどういう意味ですか?)。代わりに、私は通常グループで行われることに焦点を当てます。

interface Group<T>{
  T add(T e1, T e2);  //adds two elements of the group and returns the result
  //sub is not a group operation, there is normally only one op
  ...
}

リングについても同じですが、mul()操作を追加します。

グループ/リング内に含まれる要素のみを操作で使用できるようにする場合は、実装で引数がグループ/リング内にあるかどうかを確認し、ない場合は例外をスローする必要があります。これは値ベースのチェックであり、型チェックではないため、型システムはこれを行うようには設計されていません。

于 2012-12-12T14:36:21.683 に答える
1

多分あなたはそのようなインターフェースを使いたいですか:

public interface Test<T> {
    public void add(T t);
}

そして、必要に応じて、関数で instanceof を使用できますか?

于 2012-12-12T14:30:19.193 に答える