2

Faceインターフェースを次のように定義しました。

public interface Face {
    <R> LoadBalancer<R> create(List<R> resources);    
}

次に、別のインターフェイスTypeと、インターフェイスを実装する 2 つのクラスFace

public interface Type{}

これは、FaceImpl1Face という名前のインターフェースの最初の実装です。

public class FaceImpl implements Face {

    @Override
    public <R extends Type> create<R> newLoadBalancer(List<R> resources) {
        return new SomeObject<R>(resources).
    }
}

さらに別の実装FaceImpl2

public class FaceImpl2 implements Face {

    @Override
    public <R> create<R> create(List<R> resources) {
        return new SomeObject2<R>(resources).
    }
}

ご覧のとおり、ジェネリック型を でインターフェイスRを実装するクラスに制限したいのですが、クラスでは、この制限は必要ありません。TypeFaceImpl1FaceImpl2

問題は、Java がこれを許可していないことです。これを行うには、2 つの異なるクラスをどのように実装すればよいでしょうか? または、これを行うためのより良い方法はありますか?

4

1 に答える 1

2

これを行うにはinterface、境界型でそれ自体をジェネリックにします

interface Face<R> {

    List<? extends R> create(List<? extends R> resources);
}

public interface Type {
}

public class Impl implements Face<Type> {

    @Override
    public List<? extends Type> create(List<? extends Type> resources) {            
    }
}

public class Impl2 implements Face<Object> {

    @Override
    public List<? extends Object> create(List<? extends Object> resources) {
    }
}

interfaceそうしないと、コントラクトに「任意のタイプ」と記載されているため、メソッドはで定義されたコントラクトを実装しておらずR、メソッドをより制約的にしています。

誰かがこれをするとどうなるか考えてみてください:

final FaceImpl1 face1 = new  FaceImpl1();
final Face face = (Face) face1;

これは完全に有効ですが、あなたの試みの下では、タイプの制限が失われます。

に型を追加すると、aを ainterfaceにキャストすることになるため、コンパイラの警告が表示されます。つまり、生の型です。Face<Something>Face

于 2013-04-11T11:16:25.040 に答える