2011-12-15 2 views
2

私はJavaジェネリックでこの問題を解決できると確信していますので、私は尋ねたいと思いました...それぞれが共通のインターフェースを実装するクラスがいくつかあります。 getDataと呼ばれる一般的なインターフェイスでは、これを一般化したいと考えています。私が持っている問題は、各クラスが異なるオブジェクト型を返すということです。理想的にはこれらを汎用的にしたいと思っていて、getDataを呼び出す実装クラスで元の型に戻してください。 Objectにキャストして特定のタイプに戻すと、それがどのように機能するか見ることができますが、Genericsで同じ最終結果を達成できますか?ここでこれを解決するためのより良い方法のためのジェネリックの使用

は、問題の概要を説明するためにいくつかの擬似コードです:

public ClassA implements interface x { 

    private CustomObjectA customObjectA; 
    private Map<DateTime, Map<String, CustomObjectA>> dataMap; 

... 

    public Map<DateTime, Map<String, CustomObjectA>> getData() { 
     return this.dataMap; 
    } 
} 

public ClassB implements interface x { 

    private CustomObjectA customObjectB; 
    private Map<DateTime, Map<String, CustomObjectB>> dataMap; 

... 

    public Map<DateTime, Map<String, CustomObjectB>> getData() { 
     return this.dataMap; 
    } 
} 

public interface x { 
    public Map<DateTime, Map<String, genericObject>> getData(); 
} 


public ClassC { 
    public testGeneric(x objX) { 

     CustomObjectA cOA = objX.getData(); 
     CustomObjectB cOB = objX.getData(); 
    } 
} 
+0

は完全に無関係なCustomObjectBとCustomObjectAですか? –

+0

はい、彼らは完全に異なるメンバーを持っています – Hoofamon

答えて

5

することは一般的なインタフェースです:

public interface X<T> { 
    Map<DateTime, Map<String, T>> getData(); 
} 

public class A implements X<CustomObjectA> { 
    @Override 
    public Map<DateTime, Map<String, CustomObjectA>> getData() { 
     ... 
    } 
} 

public class B implements X<CustomObjectB> { 
    @Override 
    public Map<DateTime, Map<String, CustomObjectB>> getData() { 
     ... 
    } 
} 

public class C { 
    public static void main(String[] args) { 
     X<CustomObjectA> a = new A(); 
     Map<DateTime, Map<String, CustomObjectA>> m1 = a.getData(); 
     X<CustomObjectB> b = new B(); 
     Map<DateTime, Map<String, CustomObjectB>> m2 = b.getData(); 
    } 
} 
+0

完璧な例、ありがとう、すぐに物事をクリアしました – Hoofamon

+0

@サイバーモンク:あなたは正しいです。私は私の答えを編集しました。 –

1

だけで、インターフェイスがジェネリックにするために十分ではないでしょうか?

public interface x <T> { 
    public Map<String,T> getData() 
} 

、その後のコースのクラスは、あなたのCustomObjectAとCustomObjectBが共通のスーパークラスを拡張しまし

public class ClassA implements x<CustomObjectA> 
1

ようなインターフェイスを実装する必要があります。その後、読むためにあなたのインターフェースにメソッド宣言を変更します。

public Map<DateTime, Map<String, ? extends CustomObjectSuperclass>> getData(); 
2

あなたはこのような何か必要があります:あなたはおそらく欲しい

public interface X<T> { 
    Map<Date, Map<String, T>> getData(); 
} 

public class ClassA implements X<CustomObjectA> { 

    private CustomObjectA customObjectA; 
    private Map<DateTime, Map<String, CustomObjectA>> dataMap; 

... 

    public Map<DateTime, Map<String, CustomObjectA>> getData() { 
     return this.dataMap; 
    } 
} 

public class ClassB implements X<CustomObjectB> { 

    private CustomObjectB customObjectB; 
    private Map<DateTime, Map<String, CustomObjectB>> dataMap; 

... 

    public Map<DateTime, Map<String, CustomObjectB>> getData() { 
     return this.dataMap; 
    } 
} 
1

ような何かこれは助けてください:

public interface GenericObject<T> { 
    public Map<DateTime, Map<String, T>> getData(); 
} 

public class ClassA implements GenericObject<CustomObjectA> { 
    public Map<DateTime, Map<String, CustomObjectA>> getData() { 
     // ... 
    } 
} 

public class ClassB implements GenericObject<CustomObjectB> { 
    public Map<DateTime, Map<String, CustomObjectB>> getData() { 
     // ... 
    } 
} 
2
import java.util.Calendar; 
import java.util.Map; 


public class GenericsExample { 

    public static interface X<T> { 
    public Map<Calendar, Map<String, T>> getData(); 
    } 

    public static class A implements X<Long> { 
    private Map<Calendar, Map<String, Long>> dataMap; 
    public Map<Calendar, Map<String, Long>> getData() { 
     return this.dataMap; 
    } 
    } 

    public static class B implements X<Double> { 
     private Map<Calendar, Map<String, Double>> dataMap; 
     public Map<Calendar, Map<String, Double>> getData() { 
      return this.dataMap; 
     } 
    } 

    public static void main(String[] args) { 
    X<Long> a = new A(); 
    X<Double> b = new B(); 
    Map<Calendar, Map<String, Long>> longData = a.getData(); 
    Map<Calendar, Map<String, Double>> doubleData = b.getData(); 
    } 
} 
1

あなたの質問に直接答えることはできないので、私の答えはちょっと見えるかもしれませんが、最も適切な答えかもしれません(あなたのクラスが何をするか)。

CustomObjectAとCustomObjectBが本当に完全に無関係な場合は、getDataメソッドのインターフェイスを定義しないでください。このメソッドは、ClassAとClassBではまったく異なるものを返し、同じインタフェースの下でそれらをグループ化するのはあまり意味がありません。 ClassA.getData()とClassB.getData()は引き続き使用できますが、継承を使用して同じコードで両方を使用することはできません。しかし、getDataによって返されるものは、どちらの場合も全く異なるため、これは決して発生しません。あなたの質問に

、その後のgetDataを呼び出す実装クラスでは、バック 元の型に変換します。

は正しく発音しません。一部の部品をジェネリックにするのではなく、より高いレベルでデザインを再考する必要があります。

関連する問題