1

如何根据通用类型选择不同的方法?

简单地说,我有一个用泛型类型参数化的类,我必须根据 T 类型选择正确的 PreparedStatement 设置器:

Class CustomFieldsTypeManager<T> {
   ArrayList<T> data;

   public void setUpStatement(PreparedStatement st){
      ...
      if ( **T==String** ){
         st.setString(index, (String) data<T>.get(dt_index);
      } else if ( **T==Integer** ){
         st.setInt(index, (String) data<T>.get(dt_index);
      }
      ...
   }
}
4

3 回答 3

4

由于类型擦除,泛型信息在运行时丢失。您应该通过提供类的特化来尝试以不同的方式利用参数多态性:

class CustomFieldsTypeManager<T> {
   ArrayList<T> data;

   abstract void setUpStatement(PreparedStatement st);
}

class StringCustomFieldsTypeManager extends CustomFieldsTypeManager<String> {
   void setUpStatement(PreparedStatement st) {
     st.setString(index, data.get(dt_index)); // data it's already an ArrayList<String>
   }
}

还有一些方法可以在运行时检查它,但这有点违背泛型继承的优点,即使它们与此解决方案一样安全(必须正确编写它们)。

于 2013-03-29T15:14:14.210 回答
0

您正在寻找instanceof

if ( data.get(dt_index) instanceof String ) {
    //...
}
于 2013-03-29T15:13:04.820 回答
0

你不能。但你可以做的是:

class CustomFieldsTypeManager<T> {
    private Class<T> type;
    public CustomFieldsTypeManager(Class<T> type) {
        this.type = type;
    }
}

然后:

CustomFieldsTypeManager<String> m = new CustomFieldsTypeManager<String>(String.class);

最后:

public void setUpStatement(PreparedStatement st) {
    if (type.equals(String.class)){
        st.setString(index, (String) data<T>.get(dt_index);
    } else if (type.equals(Integer.class)){
        st.setInt(index, (String) data<T>.get(dt_index);
    }
}

或者,只需使用该PreparedStatement#setObject方法而不是您正在使用的方法。

于 2013-03-29T15:14:24.023 回答