2009-04-28 5 views
31

Wenn ich eine Klasse, die etwa wie folgt aussieht:Feder definieren Bean eine Klasse mit generischen Parametern

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

Wie würde ich über erklärt dies wie eine Bohne in meinem Zusammenhang xml gehen, so dass ich das einstellen Foo-Array vorausgesetzt, ich weiß, was T sein wird (in meinem Beispiel, sagen wir, T ist ein enum mit den Werten ONE und TWO)?

Im Moment so etwas wie dies ist nicht genug Feder zu sagen, was der Typ T ist:

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

Edit: die Liste Tag vergessen.

Antwort

30

Spring hat keine generische Unterstützung für diesen Fall, aber der Compiler erstellt in diesem Fall nur eine Klassenübersetzung. Also die richtige Lösung ist:

<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> 

Alternativ können Sie eine custom editor definieren.

+4

Wie Frühling kennt die Enum ONE und ZWEI kamen? – digiarnie

11

Betrachten Sie Arbeitsbeispiel.

<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> 

und

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

Einfache generische Klasse:

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

Und schließlich die Testmethode (mit Werk):

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.")); 
}