2011-02-10 91 views
5

目前,我有這樣的事情: -在泛型類中創建泛型方法名稱?

public class MyHolder<T> { 
    private T value; 

    public MyHolder(T t) { 
     this.value = t; 
    } 

    public T getValue() { 
     return first; 
    } 

    public void setValue(T t) { 
     this.first = t; 
    } 
} 

有了這個,我可以這樣使用它: -

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.getValue(); // returns bean 

而不是調用的getter/setter是getValue()setValue(..)的,是是否有可能「生成」呢?

從本質上講,這將是很好有它getMyBean()setMyBean(..),根據傳入的類型。誠然,這是一個很簡單的例子,但是如果我創建一個通用持有者類佔據N一般屬性,那麼這將是很高興稱之爲有意義的東西,而不是getValue1()getValue2(),依此類推。

謝謝。

+1

你不應該創建一個通用持有者類,它需要N個通用屬性。使用有用的名稱和有用的字段名稱創建實際的類。 – ColinD 2011-02-10 21:00:31

+1

我很確定它不能以你喜歡的方式使用,即使它是可能的。 – maaartinus 2011-02-10 21:07:14

回答

5

不。在Java中沒有這樣的功能。我甚至無法想象它在句法上的外觀如何...... void set<T>();?而且,例如MyHolder<? extends Number>的getter/setter將如何顯示?

1

不,這是不可能的,除非您使用某種源代碼生成器根據您的輸入生成MyHolder類。

但是,另一方面,即使你有這種可能性,它將如何不同於使用Map<String, T>?因此,調用將顯示爲:

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.get('value'); 
1

不,不可能。 Java泛型基於類型擦除,即它主要是編譯器提供的語法糖。這意味着每個泛型類實際上都是由「原始類型」實現的,其中類型參數爲Object,並且其中已包含所有方法。所以根據類型參數,根本不可能有不同的方法。