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