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

できません。しかし、あなたができることは次のとおりです。

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 に答える
0

あなたが探しているinstanceof

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