2009-04-28 33 views
31

Nếu tôi có một lớp học mà trông giống như sau:Xác đậu mùa xuân bằng một lớp học với các thông số chung

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

Làm thế nào tôi sẽ đi về tuyên bố này như một bean trong xml bối cảnh của tôi để tôi có thể thiết lập Foo mảng giả sử tôi biết những gì T là có được (trong ví dụ của tôi, hãy nói T là một enum với các giá trị ONE và HAI)?

Tại thời điểm này, có một cái gì đó như thế này là không đủ để nói mùa xuân những gì các loại T là:

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

Edit: Quên thẻ danh sách.

Trả lời

30

Mùa xuân không có hỗ trợ chung cho trường hợp đó, nhưng trình biên dịch chỉ tạo một lớp diễn viên trong trường hợp này. Vì vậy, giải pháp đúng là:

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

Hoặc, bạn có thể xác định custom editor.

+4

Làm thế nào để mùa xuân biết enum ONE và HAI đến từ đâu? – digiarnie

11

Hãy xem xét ví dụ làm việc.

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

Simple lớp generic:

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

Và cuối cùng, (nhà máy sử dụng) phương pháp thử nghiệm:

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.")); 
} 
Các vấn đề liên quan