2012-04-25 18 views
1

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

Haveあなたはを試しましたか?これを行うには、resolver.resolve(X).foo(Y)はBaseDTOのスーパークラスとしてXとYを持っていなければなりません。 –

+0

はい、これはメソッドのジェネリックのための明らかな選択です。私は 'BaseService 'を保証することはできません。 'T 'は理論的に' AaaDTO'のサブクラスになる可能性があるので、 'BaseService 'を返しました。それは明らかに問題で、私はそれを 'BaseService 'に変更しました。これはコンパイラが受け入れます。しかし、事件についての警告はまだあります。メソッドは、 'object'が' BaseDTO'のサブクラスである場合にのみ当てはまります。そうでなければ、サービスはありません。リゾルバのアイデアは、方法によって「X == Y」です。与えられたオブジェクトに対して適切なサービス実装を見つけて呼び出します。 – user1252434

+0

TがAaaDTOのサブクラスである場合、継承は推移的です。すなわち、(AはBから継承し、(BはCから継承します)、(AはCを継承します)。変更後にコードが機能するのか、それとも問題がまだ残っていますか? –

答えて

1

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(); 
     } 
    } 
} 

は単に私は以下のが安全であるコンパイラに伝えたいと述べ

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(); 
     } 
    } 
+0

これは簡単です...理論的に 'T'は' AaaDTO'のサブクラスであり、 'AaaService'だけが返されます。だから私は明らかに私の問題だった 'BaseService 'を返そうとしていた。 – user1252434

関連する問題