[英]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.