تحديد الفول الربيع باستخدام فئة مع المعلمات العامة

StackOverflow https://stackoverflow.com/questions/800313

  •  03-07-2019
  •  | 
  •  

سؤال

وإذا كان لدي فئة ويبدو أن شيئا من هذا القبيل:

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

وكيف لي أن التوجه نحو معلنا في ذلك الفول في بلدي السياق أكس حتى أستطيع أن تعيين مجموعة فو افتراض أعرف ما T سيكون (في بلدي على سبيل المثال، دعنا نقول T هو التعداد مع القيم واحد و الثاني)؟

في الوقت الحالي، وجود شيء من هذا القبيل لا يكفي أن أقول الربيع ما نوع 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-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>

و

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

وبدلا من ذلك، يمكنك تحديد محرر مخصصة .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top