2009-04-28 6 views
31

Si tengo una clase que se ve algo como esto:Definición de frijol de primavera usando una clase con parámetros genéricos

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

¿Cómo hago para declarar esto como un grano en mi contexto XML para que pueda establecer el Foo array suponiendo que sé lo que va a ser T (en mi ejemplo, supongamos que T es una enumeración con los valores UNO y DOS).

Por el momento, tener algo como esto no es suficiente para decir lo que la primavera del tipo T es:

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

Editar: olvidó la lista de etiquetas.

Respuesta

30

Spring no tiene soporte genérico para ese caso, pero el compilador solo crea un molde de clase en este caso. Entonces la solución correcta es:

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

O bien, puede definir un custom editor.

+4

¿Cómo sabe resorte que enumeración UNO y DOS vinieron? – digiarnie

11

Considere el ejemplo de trabajo.

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

y

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

simple clase genérica:

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

Y, por último, el método de ensayo (usando fábrica):

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