-1

私は次のクラスを持っています

public class DBField<T>
{
  protected String fieldName;
  protected FieldConverter c;
  protected T value;
  protected DataObject dataObject;

  public T getValue()
  {
    return value;
  }

  public void setValue(T value)
  {
    this.value = value;
  }

  public DBField(DataObject dataObject, String fieldName, FieldConverter c)
  {
    this.fieldName = fieldName;
    this.c = c;
    this.dataObject = dataObject;
  }
}

T は Boolean、Float、String などであるはずです。

protected void ValuesToFields(List<Object> values, List<DBField<?>> fields) throws Exception
  {
    if (values.size() != fields.size())
      throw new Exception("Length does not match.");
    for (int i = 0; i < values.size(); i++)
    {
      Class valueClass = values.get(i).getClass();
      Class fieldClass = fields.get(i).getValue().getClass();
      if (valueClass.equals(fieldClass))
      {
        fields.get(i).setValue(values.get(i));
      }
      else
        throw new Exception("type mismatch");
    }
  }

オブジェクトには、Boolean、Float、String なども含まれるはずです。

このコードの問題は

fields.get(i).setValue(values.get(i));

構文チェッカーは、values.get(i) をキャストする必要があることを教えてくれます (? 私は疑う)。どうすればいいですか?私はすでに valueClass.cast(values.get(i)) を試しましたが、うまくいきませんでした。

4

3 に答える 3

1

コードを安全にするためにi、 の i 番目の要素は、 の i 番目の要素であるvaluesの型パラメータのインスタンスである必要があります。あなたのコードはこれが成り立つことを保証しておらず、実際、対応する要素間のこの関係が真であることを保証するために Java でそれらを宣言する方法はありません。また、型の消去により、実行時に要素が正しいことを確認することさえできません。フィールドが与えられた場合、その型パラメーターがわからないためです。したがって、チェックされていないキャストがいくつかあるはずであり、引数が正しいと信じなければなりません。DBFieldfields

最も簡単なことは、各フィールドをDBField<Object>次のようにキャストすることです。

((DBField<Object>)fields.get(i)).setValue(values.get(i));

これは一種の「信頼してください。このフィールドはObject任意の値を取ることができるため、任意の型の値を取ることができることを知っています。型パラメータが ではないフィールドがあるはずだとわかっているので、それは一種の嘘ですがObject、とにかくある種のチェックされていないキャストを作成する必要があるため、この「安全でないキャスト」は他のソリューションよりも悪くありません。

あるいは、この間違いなく疑わしいキャストを行いたくない場合、より「正当な」方法は、プライベート ヘルパー メソッド (「ラッパー ヘルパー」) を作成することです。この型の値に単純にキャストするには:

private <T> static void ValueToField(Object value, DBField<T> field) {
    field.setValue((T)value);
}

//...
ValueToField(values.get(i), fields.get(i));

ここでのキャストも未チェックのキャストであることに注意してください。このメソッドの欠点は、追加のメソッドを記述するオーバーヘッドが必要になることです。

PSあなたのチェックはあまり良くありませんvalueClassfieldClassまず、フィールドの値が現在のnull場合、null ポインター例外が発生します。また、 a の値DBField<T>は の任意のインスタンスでありT、その実際のクラスは のサブクラスである可能性がありTます。したがって、これを使用してチェックすると、悪い結果につながる可能性があります。DBFieldのクラスのクラス オブジェクトが含まれているとT、チェックに使用できるので、おそらく最適です。また、等値を値の実際のクラスと比較するべきではありません。サブクラスTも機能するため、fieldClass.isInstance(values.get(i))代わりに確認する必要があります。

于 2012-11-24T04:39:06.813 に答える
0

if(values.get(i) instanceof valueClass)?

于 2012-11-23T10:33:01.183 に答える
-1

あなたが持っていList<Object>ます。

List<DBField<Object>>それに一致する必要があるか、最初のリストをに変更する必要がありますList<?>

于 2012-11-23T10:34:16.407 に答える