首页 文章

使用具有泛型参数的类定义spring bean

提问于
浏览 1941
31

如果我有一个看起来像这样的类:

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

我将如何在我的上下文xml中将其声明为bean,以便我可以设置Foo数组,假设我知道T将会是什么(在我的示例中,假设T是一个值为ONE和TWO的枚举)?

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

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

编辑:忘记列表标记 .

3 回答

  • 30

    Spring没有针对该情况的通用支持,但编译器只是在这种情况下创建了一个类转换 . 所以正确的解决方案是:

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

    考虑工作示例 .

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

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

    简单的通用类:

    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."));
    }
    
  • 1
    <bean id="myClass" class="example.MyClass">
      <property name="foo">
        <list>
          <value>ONE</value>
          <value>TWO</value>
        </list>
      </property>
    </bean>
    

    或者,您可以定义custom editor .

相关问题