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

对象也应该包含布尔值、浮点数、字符串等。

这段代码的问题是

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

语法检查器告诉我我需要转换 values.get(i) (到?我怀疑)。我该怎么做呢?我已经尝试过 valueClass.cast(values.get(i)) 但没有运气。

4

3 回答 3

1

为了使您的代码安全,对于每个i,第 i 个元素values必须是 的第 i 个元素的类型参数的DBField实例fields。您的代码不保证这成立,事实上没有办法在 Java 中声明它们以确保对应元素之间的这种关系是真实的。而且由于类型擦除,您甚至无法在运行时检查元素是否正确,因为给定一个字段,您不知道它的类型参数。所以必须有一些未经检查的演员表,我们必须相信这些论点是正确的。

最简单的做法是将每个字段转换为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不是很好。首先,如果一个字段的值为 current 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 回答