0

私は自分のプロジェクトで使用するライブラリからのインターフェイス Vector を持っていますが、変更できません...

interface Vector<T> {
   public Vector<T> plus(Vector<T> v);
}

次に、クラスで実装しましたFourVectorが、メソッドplusをオーバーライドすると問題が発生します。すべてのタイプのベクターではなく、FourVectorのみで追加できるようにしたい! FourVector私がやろうとしていることは、このようなことです(しかし、明らかに間違っています)

class FourVector<T> implements Vector<T> {
   public Vector<T>  plus(FourVector<T> v) {
   ...
   }
}

このアイデアの実現を可能にするパターンまたは回避策はありますか?

4

2 に答える 2

1

がある場合Vector<T>、コンパイル時にVector<T>そのaddメソッドに任意の型を渡すことができます。それがインターフェースの設計方法です。

したがって、あなたFourVectorはその点で本物Vectorではありません:

  • それを受け入れて実装しないかVector
  • または、ランタイム チェックを追加できます。if (!(v instanceof FourVector)) throw new UnsupportedOperationException("Only FourVector allowed here");
于 2013-08-17T09:09:14.110 に答える
0

最初の正しいコメントを改善します。

一方、次の方法でメソッドをオーバーライドできます。

@Override
public FourVector<T> plus(Vector<T> v) {
    return null;
}

署名を使用してインターフェイスが定義されたことを認識する必要があります。また、提案された動作が非常に混乱することを認識する必要があります。次のコードを見てください。

public void a() {
    Vector<T> vector = new FourVector<>();
    b(vector);
}

public void b(Vector<T> v) {
    v.plus(new ThreeVector<T>());
}

Vectorproperty がmethod 内の型であっても、実際にはbそれであり、メソッドは のみを受け入れることを開発者はどうやって知るのでしょうか。メソッドは、特定のプロパティの正確なタイプをどうにかして知っています。しかし、ジェネリック インターフェイスでのジェネリック メソッドの目的の提案には明らかに反対です。FourVectorplusFourVectorb

于 2013-08-17T10:24:22.327 に答える