2011-12-15 67 views
2

我敢肯定,我可以用Java泛型來解決這個問題,所以我想問一下......假設我有幾個類,每個類都實現了一個通用接口,還有一個方法在通用接口getData,我想通用。我遇到的問題是每個類都返回一個不同的對象類型,所以理想情況下我希望它們是通用的,然後在調用getData的實現類中,將它們轉換回它們的原始類型。如果我想投射到Object並回到特定的類型,我可以看到這是如何工作的,但是我可以用泛型實現相同的最終結果嗎?使用泛型更好的方式來解決這個問題

下面是一些僞代碼來勾勒問題:

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完全無關? – 2011-12-15 20:35:37

+0

是的,他們有完全不同的成員 – Hoofamon 2011-12-15 20:37:23

回答

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

不足以只是使界面通用?

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

那當然類必須實現像

public class ClassA implements x<CustomObjectA> 
1

的界面讓你的CustomObjectA和CustomObjectB擴展了一個公共超類。然後,修改方法聲明在你的界面如下:

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實現類,將它們轉換回到 到原來的類型。

聽起來不對。你應該在更高的層次上重新考慮你的設計,而不是試圖製造一些零件的泛型。

相關問題