1

Javaジェネリックで次の型関係をどのように表現しますか:

class MyClass<T> { }

interface MyInterface<T extends MyClass> { 
  void m1(T<Integer> argument);
  void m2(T<String> argument);
  void m3(T<?> argument);
}

コンパイラの苦情なし。それは可能ですか?MyClassタイプセーフを壊さずに、すべてのメソッドが同じ(サブ)クラスを受け取ることを確認したいと思います。ドメインでは、異なるサブクラス ogMyClassは意味がありません。次のように、ジェネリック型変数を 3 つリストする必要がありますか。

class MyClass<T> { }

interface MyInterface<T1 extends MyClass<Integer>, 
   T2 extends MyClass<String>, T3 extends MyClass<?>> { 
  void m1(T1 argument);
  void m2(T2 argument);
  void m3(T3 argument);
}

これは読むのがひどいように感じますし、私の意図を私が望んでいたほどうまく表現していません. この質問は、まだ私を混乱させているジェネリック定義内のジェネリック生型に関する私の他の質問に関連しています。多分誰かが助けることができます!ありがとうございました。

4

2 に答える 2

0

さて、私はこれを Java で表現できないため、次のようになることに気付きました。

class MyClass<T> { }

interface MyInterface<T extends MyClass> { 
  T<S> m1(S argument);
}

しかし、私はこれに対するかなり派手な解決策を見つけました。すべてのサブインターフェイスで戻り値の型を手動でアップグレードする代わりに、Spoonを使用して、コンパイル前に対応するソース コードを読み書きします。コンパイラは、すべてのインターフェイスの戻り値の型を手動でオーバーライドしたかのようにコードを認識します。これにより、すべての Maven ビルドでコードがスーパー インターフェイスと同期された状態が保たれ、もう心配する必要はありません。

このソリューションは万人向けではないかもしれませんが、DNRY の精神に基づいて私が考えることができる最もクリーンなソリューションです。

于 2013-06-17T08:00:29.190 に答える