1

互換性のあるサービスを返すサービスルックアップメソッドが必要です。これらの特定のサービスは、同じジェネリックスーパークラスの(非ジェネリック)サブクラスであり、互換性を確保するためにジェネリックを使用したいと思います。

クラス:

  • class BaseDTO
  • class AaaDTO extends BaseDTO
  • class BbbDTO extends BaseDTO
  • interface BaseService<T extends BaseDTO>
  • interface AaaService extends BaseService<AaaDTO>
  • interface BbbService extends BaseService<BbbDTO>

以下のリゾルバークラスのプレースホルダーにどのジェネリック定義を入れる必要がありますか?resolve()指定されたオブジェクトと互換性のあるサービス実装を返すことを表現したいと思います。

public class Resolver {
    @Autowired private AaaService aaaService;
    @Autowired private BbbService bbbService;

    public <T ???> BaseService<???> resolve(T object) {
        if (object instanceof AaaDTO) {
            return (???) aaaService;
        } else if (object instanceof BbbDTO) {
            return (???) bbbService;
        } else {
            throw new IllegalArgumentException();
        }
    }
}

単純に、次のことが安全であることをコンパイラに伝えたいと言いました。

BaseDTO dto = getDtoFromSomewhereElse();
resolver.resolve(dto).foo(dto);
4

1 に答える 1

1

メソッドfooがBaseService次のように定義されている場合:

public void foo(BaseDTO dto);

次のことができます。

 public <T extends BaseDTO> BaseService<T> resolve(T object) {
        if (object instanceof AaaDTO) {
            return (BaseService<T>) aaaService;
        } else if (object instanceof BbbDTO) {
            return (BaseService<T>) bbbService;
        } else {
            throw new IllegalArgumentException();
        }
    }
于 2012-04-25T10:07:09.843 に答える