访问泛型类成员

时间:2017-11-17 01:54:33

标签: java android casting type-safety unchecked-cast

我有一种情况,我希望允许用户填写表单,其中输入数据是字符串值或布尔值的列表。这非常类似于任何手机上的设置列表,一系列字符串值和切换。

所以,我有一个Field对象定义如下:

public class Field<T> {
    private T value;
    ...
    private T getValue() {
        return value;
    }
}

问题是当我在RecyclerView中显示这些内容或者只是从Map中获取值时,没有安全的方法来知道值是什么类型,字符串或布尔值。 / p>

因此,我最终得到了很多(String)field.getValue()((Field<String>)field).setValue("someString")。有没有办法完全避免施法?我完全乐于改变我对这个Field对象的设计方法,我只是希望它是干净的。

我已经考虑过使用getStringValue()getBooleanValue()这样的方法,以便调用者知道它在运行时获取String或Boolean,但这会导致每个字段都有一个返回有效对象的方法,而其他方法返回null。我希望调用者必须知道它回来了什么。

感谢您的帮助!

更新

以下是我如何从LinkedHashMap访问字段并使用它们创建Person对象的示例:

// Create the map in one place
LinkedHashMap<String, Field> fields = new LinkedHashMap<(PERSON_FIELDS_NUM);
fields.put(Constants.Field.FIRST_NAME_KEY, new Field(Constants.Field.FIRST_NAME_KEY, "First Name", "Tap to enter"));
fields.put(Constants.Field.LAST_NAME_KEY, new Field(Constants.Field.LAST_NAME_KEY, "Last Name", "Tap to enter"));

// ...Grab fields in another
Person person = new Person();
Field firstName = this.fields.get(Constants.Field.FIRST_NAME_KEY);
Field lastName = this.fields.get(Constants.Field.LAST_NAME_KEY);
person.setFirstName((String)firstName.getValue());
person.setLastName((String)lastName.getValue());

0 个答案:

没有答案