2

既存の設計で行っている再設計/リファクタリングにジェネリックを使用するのが困難です。

public interface DataDto {
    // some data here
}

public interface SetDto<MyDataDto extends DataDto> {
    List<MyDataDto> getData();
}

public interface Results<MySetDto extends SetDto<DataDto>> {
    MySetDto getResults();
}

public interface MyProblemInterface<MyDataDto extends DataDto,
        MySetDto extends SetDto<MyDataDto>,
        MyResults extends Results<MySetDto>> {
    // some stuff here
}

私の問題は、次のエラーが発生することですMyProblemInterface

Bound mismatch: The type MySetDto is not a valid substitute for the
bounded parameter <MySetDto extends SetDto<DataDto>> of the type
Results<MySetDto>

MyProblemInterfaceジェネリックの経験が多少限られていることは認めますが、基本的には、3 つの型すべてが同じ「型」であることを強制しようとしています。たとえば、 、 、 、 、 がある場合ADataDtoBDataDtoクラスASetDto<ADataDto>BSetDto<BDataDto>MyProblemInterfaceAResults<ASetDto>BResults<BSetDto>のような方法で実装できないようにしたいと考えていますAMyProblemInterface<ADataDto, ASetDto, BResults>MySetDtoうまく拡張できるので、それをさらに進めることができると思いますが、SetDto<MyDataDto>明らかに間違っています。

助けてくれてありがとう。

4

2 に答える 2

0

Javaジェネリックから多くのことを望んでいます。

次のようにインターフェイスを宣言する方が簡単です。

public interface MyProblemInterface<MyDataDto extends DataDto>

そして、強制的にメソッドに and を使用さSetDto<MyDataDto>Results<MySetDto>ます。

クラス/インターフェース宣言でジェネリックを使用することにより、定義の後半で決定されるある種の種類を指定します。しかし、あなたの場合、あなたはそれを言ってSetDtoResults常にMyDataDtoパラメーターとして持っているので、多様性はありません。

于 2012-12-27T22:13:13.390 に答える
0

代わりにこのようなものではなく、インターフェイスを実装するときにのみ実際のクラスを追加します。

正しい結果定義を追加するのを忘れていたため、コードを更新しました。これはうまくいくはずです。

public interface DataDto {
    // some data here
}

public interface SetDto<T extends DataDto> {
    List<T> getData();
}

public interface Results<T extends SetDto<? extends DataDto>> {
    T getResults();
}

public interface MyProblemInterface<T extends DataDto, E extends SetDto<T>, K extends Results<E>> {
    // some stuff here
}
于 2012-12-27T22:29:20.660 に答える