互換サービスを返すサービス検索メソッドが必要です。これらの特定のサービスは、同じ汎用スーパークラスの(非汎用の)サブクラスであり、互換性を保証するためにジェネリックを使用したいと思います。Java Generics:互換性のあるサービスサブクラス
クラス:
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()
が指定されたオブジェクトと互換性のあるサービス実装を返すと表現したいと思います。次のようにメソッドfooがBaseService
に定義されている場合
BaseDTO dto = getDtoFromSomewhereElse();
resolver.resolve(dto).foo(dto);
Haveあなたはを試しましたか?これを行うには、resolver.resolve(X).foo(Y)はBaseDTOのスーパークラスとしてXとYを持っていなければなりません。 –
はい、これはメソッドのジェネリックのための明らかな選択です。私は 'BaseService'を保証することはできません。 'T 'は理論的に' AaaDTO'のサブクラスになる可能性があるので、 'BaseService super T>'を返しました。それは明らかに問題で、私はそれを 'BaseService 'に変更しました。これはコンパイラが受け入れます。しかし、事件についての警告はまだあります。メソッドは、 'object'が' BaseDTO'のサブクラスである場合にのみ当てはまります。そうでなければ、サービスはありません。リゾルバのアイデアは、方法によって「X == Y」です。与えられたオブジェクトに対して適切なサービス実装を見つけて呼び出します。 –
user1252434
TがAaaDTOのサブクラスである場合、継承は推移的です。すなわち、(AはBから継承し、(BはCから継承します)、(AはCを継承します)。変更後にコードが機能するのか、それとも問題がまだ残っていますか? –