2012-11-07 48 views
0

我不知道是否有可能創建一個「模板化的」吸氣劑,如:物體的「鑄造模板」getter的對象的地圖?

class TestGet 
{ 
    private static Map<String,Object> theMap..... 

    public static getObject<T>(String key)..... 

並在代碼的某個地方,這樣的:

JButton myButton = TestGet.getObject<JButton>("theButton"); 

請注意:這是只是的「閒置」問題,我試圖避免在代碼中「髒」投射,因爲每次看到它們時都會讓眼睛流血。

我知道有更優雅的方法可以做到這一點,但我真的會用一張地圖來避免與其他類的鏈接。

我嘗試了一些配置,但沒有任何東西似乎適合我想要做的事情......是否有可能的模板?

+0

爲什麼你需要的是'型parameter',如果你已經有你在你的地圖鍵和對象的映射? –

+0

@Rohit:我想在將對象返回給getter之前「預先」對象,因爲這些對象可以是例如。 JButton,JLabel,String等。 – Benj

回答

4

你可以寫

public static <T> T getObject(String key) { 
    return (T) theMap.get(key); // produces a warning. 
} 

JButton myButton = TestGet.<JButton>getObject("theButton"); 

或只是

JButton myButton = TestGet.getObject("theButton"); 

對於更復雜的例子;)

class A<T> { 
    class B<S> { 
     public <U extends S> U tsu() { 
      return null; 
     } 
    } 
} 

List<String> list = new A<Integer>().new B<List>().<List<String>>tsu(); 
+1

哇! TestGet。 getObject完全適合我!謝謝 ! – Benj

+0

+1不知道我們也可以這樣做..'TestGet。 '。這是我第一次看到。 –

+0

*「更復雜的例子」*:令人驚歎的例子和更有用的,我會用它! – Benj

1

如果你想要做的就是隱藏演員陣容,就像Peter展示的那樣簡單。如果還想避免ClassCastExceptions,則輸入erasure指示您必須將該類作爲參數傳入(對於泛型類型,您不能執行instanceof)。這有點亂。

class TestGet { 
    private static final Map<String,Object> theMap = new HashMap<String, Object>(); 

    @SuppressWarnings("unchecked") 
    public static <T> T getObject(final String key, final Class<T> clazz) { 
     final Object o = theMap.get(key); 
     return o != null && clazz.isAssignableFrom(o.getClass()) 
       ? (T) o 
       : null; 
    } 
} 

然後

JButton b = TestGet.getObject("theButton", JButton.class); 
+0

好的,使用Class類型的參數很好,但我更喜歡Peter的符號< >。您的解決方案仍然提供可分配的概念,無論如何這可能很有用。對於那個+1 – Benj

+0

使用TestGet。 getObject()僅當類型推理器無法確定要返回什麼類型(在Java中的頻率太頻繁)時纔是必需的。我的例子是爲了避免它:) – Spyder

+0

我更喜歡每次指定它,但它是我的首選項。感謝我沒有意識到的isAssignableFrom方法。 – Benj