Definieren Feder Bean eine Klasse mit generischen Parametern
Frage
Wenn ich eine Klasse, die etwa wie folgt aussieht:
public class MyClass<T extends Enum<T>> {
public void setFoo(T[] foos) {
....
}
}
Wie würde ich in meinem Zusammenhang xml gehen über dies als eine Bohne erklärt, so dass ich die Foo Array festlegen können unter der Annahme, ich weiß, was T (in meinem Beispiel sein wird, sagen wir, T eine Enumeration mit den Werten ONE ist und TWO)?
Im Moment haben so etwas wie das 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: Vergessen Sie die Liste Tag
.Lösung
Frühling hat keine generische Unterstützung für diesen Fall, aber der Compiler erzeugt nur eine Klasse Besetzung in diesem Fall. So ist 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>
Andere Tipps
Betrachten Beispiel arbeiten.
<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."));
}
<bean id="myClass" class="example.MyClass">
<property name="foo">
<list>
<value>ONE</value>
<value>TWO</value>
</list>
</property>
</bean>
Alternativ können Sie definieren einen benutzerdefinierten Editor .