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