Pregunta

Si tengo una clase que se parece a esto:

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

¿Cómo voy a declarar esto como un bean en mi xml de contexto para poder establecer la matriz Foo suponiendo que sé qué T va a ser (en mi ejemplo, digamos que T es un enumeración con los valores UNO y DOS)?

En este momento, tener algo como esto no es suficiente para decirle a Spring qué 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 etiqueta de la lista.

¿Fue útil?

Solución

Spring no tiene soporte genérico para ese caso, pero el compilador solo crea un reparto de clase en este caso. Así que 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>

Otros consejos

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>

Clase genérica simple:

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

Y finalmente, el método de prueba (usando la 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."));
}
<bean id="myClass" class="example.MyClass">
  <property name="foo">
    <list>
      <value>ONE</value>
      <value>TWO</value>
    </list>
  </property>
</bean>

Alternativamente, puede definir un editor personalizado .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top