Java 使用带有泛型参数的类定义Springbean

Java 使用带有泛型参数的类定义Springbean,java,generics,spring,Java,Generics,Spring,如果我有一个类似这样的类: public class MyClass<T extends Enum<T>> { public void setFoo(T[] foos) { .... } } 公共类MyClass{ 公共无效setFoo(T[]foos){ .... } } 我如何在我的上下文xml中将其声明为bean,以便在我知道T将是什么的情况下设置Foo数组(在我的示例中,假设T是一个值为1和2的枚举) 目前,拥有这样的东西还不足以告诉sprin

如果我有一个类似这样的类:

public class MyClass<T extends Enum<T>> {
  public void setFoo(T[] foos) {
    ....
  }
}
公共类MyClass{
公共无效setFoo(T[]foos){
....
}
}
我如何在我的上下文xml中将其声明为bean,以便在我知道T将是什么的情况下设置Foo数组(在我的示例中,假设T是一个值为1和2的枚举)

目前,拥有这样的东西还不足以告诉spring T是什么类型:

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

一个
两个
编辑:忘记列表标签。


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

或者,您可以定义一个。

Spring不支持这种情况,但是编译器在这种情况下只创建一个类强制转换。因此,正确的解决方案是:

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

一个
两个

考虑工作示例

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

java.lang.Integer


java.lang.String
简单泛型类:

public class GenericSimple<T> {
    private Class<T> type;
    public GenericSimple(Class<T> type) {
        this.type = type;
    }
    public T get( T t) {
        return t;
    }
}
public类GenericSimple{
私人阶级类型;
公共泛型简单(类类型){
this.type=type;
}
公共T获取(T T){
返回t;
}
}
最后,试验方法(使用工厂):

public void testGeneric(){
工厂=新工厂(新字符串[]{“config/beanForGenericTest.xml”});
一般简单简单
=(GenericSimple)factory.getClass(“simpleInt”);
System.out.println(simpleInt.get(Integer.valueOf(100));
Assert.assertTrue(simpleInt.get(Integer.valueOf(100)).equals(100));
GenericSimple simpleString=
(GenericSimple)factory.getClass(“simpleString”);
System.out.println(simpleString.get(新字符串(“火箭走得快”));
Assert.assertTrue(simpleString.get(“火箭跑得快”)
.equals(“火箭跑得很快”);
}

spring如何知道枚举1和枚举2来自哪个?
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."));
}