2016-09-02 7 views
1

型指定されたインターフェイス定義を作成しています。タイプパラメータの可能な値をクラスのセットに制限します。これらのクラスは既に存在し、私のコントロール下にありません。また、それらはクラス階層を介して相互に関連していません。特定のクラスのインターフェイスでJavaジェネリック型パラメータを制限する方法

たとえば、私は3つのクラスA、B、Cを持っています。私のインターフェイスはIMyFancyInterface<T>です。 このインターフェイスの実装者を制限し、TがA、B、またはCのいずれかであることを確認するにはどうすればよいですか? ありがとうございました。この方法であなた

public interface IMyFancyInterface<T extends Super> { .. } 

乾杯、

マーティン

+0

あなたの意図は、おそらく正しいデザインではありません。 – Kelvin

+0

OK、私は明確にしましょう:訪問者パターンに似た何かを作成しています。ここで、A、B、Cは訪問されているオブジェクトのクラスです。私はA、B、Cを変更することができないので、「類似」と言います。標準実装のようにaccept(Visitor v)メソッドを追加することはできません。代わりに、訪問者クラスがこれを実装できるように、メソッド訪問(A o)で型付きのVistorインターフェイスを作成したかったのです。 AVisitorはIMyVisitorInterface を実装しています。 –

+0

また、訪問者の実装を保持するトラバーサルクラスがあり、タイプA、B、Cのオブジェクトを保持する構造体をトラバースしてvisit()メソッドを呼び出す必要があります。 –

答えて

3

A場合は、BCは、あなたが行うことができ、(のは、それがSuperと呼ばれています言わせて)、共通のスーパータイプを持っていますこのインターフェイスは、SuperのサブタイプであるA,Bまたはのタイプパラメータで常に実装する必要があります。

ただし、A,BおよびCに共通のスーパータイプがない場合は、マーカーインターフェイス(抽象メソッドのないインターフェイス)を作成して実装することができます。たとえば:あなたはアプローチに従うことができるだろう

public interface Marker { } 

public class A implements Marker { } 

public class B implements Marker { } 

public class C implements Marker { } 

この方法では、私が最初に提案:

public interface IMyFancyInterface<T extends Marker> { .. } 
+0

コンスタンチンの提案に感謝します。私は同じ方向への考えを持っていましたが、残念ながら、これらのクラスは関連していませんし、それらも変更できません。 –

+0

このような場合、私はあなたに多くのオプションがあるとは思わないが、 'IMyFancyInterface'が不適切に使われていないことを確認するだけです。 –

3

あなたがすることはできません。

class MyClass implements IMyFancyInterface<T> 
{ 
    <T extends A | B | C> void DoSomething(T o) 
    { 
     // what should the parameter o behave like? 
     // o.??? 
    } 
} 
わずか数A/B/Cの実装が存在する場合は、非ジェネリックメソッドを使用することができます

interface MyFancyInterface 
{ 
    void DoA(A a); 
    void DoB(B b); 
    void DoC(C c); 
} 

または1つの方法でキャスト:

それが可能だ場合は、次のコードを検討
interface MyFancyInterface 
{ 
    void Do(Object o); 
} 

class MyClass implements MyFancyInterface 
{ 
    public void Do(Object o) 
    { 
     if (o instanceof A) 
     { 
      //do something with A 
     } 
     else if ... 
    } 
} 
+0

あなたの仮定的な例では、すべてのクラスで同じ署名を持つメソッドを呼び出すことができます。明らかに一般的なインターフェースがより適切でしょう。 – shmosel

0

私は今、インターフェイスを実装する3つのクラスA、B、Cの抽象クラスを作成して回避策を作成しました。したがって、インタフェースを実装する代わりに、これらの抽象クラスの1つからさらにビジタークラスを派生させる必要があります。ちょっと冗長に見えますが、明らかに他の方法はありません。

+0

あなたはクラスがあなたのコントロールにないと言いました。 – shmosel

+0

私は、タイプされたインタフェースを実装する抽象クラスを意味しました。インタフェースのタイプとしてクラスA、B、Cごとに1つです。 –

関連する問題