2009-04-28 103 views
31
一個類定義的Spring bean

如果我有一個類,看起來是這樣的:使用帶泛型參數

public class MyClass<T extends Enum<T>> { 
    public void setFoo(T[] foos) { 
    .... 
    } 
} 

我怎麼會去在我的上下文XML聲明這是一個bean,這樣我可以設置Foo數組假設我知道T將會是什麼(在我的例子中,假設T是一個具有值ONE和TWO的枚舉)?

目前,有這樣的事情是不夠的,告訴春季T類型是什麼:

<bean id="myClass" class="example.MyClass"> 
    <property name="foo"> 
    <list> 
     <value>ONE</value> 
     <value>TWO</value> 
    </list> 
    </property> 
</bean> 

編輯:忘記列表標籤。

回答

30

Spring對這種情況沒有通用的支持,但編譯器只是在這種情況下創建了類類型轉換。所以正確的解決方案是:

<bean id="myClass" class="example.MyClass"> 
    <property name="foo"> 
    <list value-type="example.MyEnumType"> 
     <value>ONE</value> 
     <value>TWO</value> 
    </list> 
    </property> 
</bean> 
1
<bean id="myClass" class="example.MyClass"> 
    <property name="foo"> 
    <list> 
     <value>ONE</value> 
     <value>TWO</value> 
    </list> 
    </property> 
</bean> 

或者,您可以定義一個custom editor

+4

如何春季知道哪個枚舉ONE和TWO從何而來? – digiarnie 2009-04-29 00:02:36

11

考慮一個工作示例。

<bean id="simpleInt" 
     class="org.nipr.gateway.service.transaction_assistant.GenericSimple"> 
    <constructor-arg> 
     <!-- this can be any full path to a class --> 
     <value>java.lang.Integer</value> 
    </constructor-arg> 
</bean> 

<bean id="simpleString" 
     class="org.nipr.gateway.service.transaction_assistant.GenericSimple"> 
    <constructor-arg> 
     <value>java.lang.String</value> 
    </constructor-arg> 
</bean> 

簡單的泛型類:

public class GenericSimple<T> { 
    private Class<T> type; 
    public GenericSimple(Class<T> type) { 
     this.type = type; 
    } 
    public T get(T t) { 
     return t; 
    } 
} 

最後,測試方法(使用工廠):

public void testGeneric(){ 
    Factory factory = new Factory(new String[]{"config/beanForGenericTest.xml"}); 

    GenericSimple<Integer> simpleInt 
     = (GenericSimple<Integer>)factory.getClass("simpleInt"); 
    System.out.println(simpleInt.get(Integer.valueOf(100))); 
    Assert.assertTrue(simpleInt.get(Integer.valueOf(100)).equals(100)); 

    GenericSimple<String> simpleString = 
     (GenericSimple<String>)factory.getClass("simpleString"); 
    System.out.println(simpleString.get(new String("Rockets go fast."))); 
    Assert.assertTrue(simpleString.get("Rockets go fast.") 
     .equals("Rockets go fast.")); 
}