繁体   English   中英

java泛型:运行时类型检查以确定策略

[英]java generics: runtime type-checking to determine a strategy

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

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

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);
      }
      ...
   }
}

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

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

还有一些方法可以在运行时检查它,但即使它们像这个解决方案一样安全(必须正确编写),这种方式也会破坏泛型的继承优点。

你正在寻找instanceof

if ( data.get(dt_index) instanceof String ) {
    //...
}

你不能。 但你能做的是:

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方法而不是您正在使用的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM