2011-02-10 98 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,并且其中已包含所有方法。所以根据类型参数,根本不可能有不同的方法。