Java Generics - 检查T的类型

时间:2011-04-21 13:45:47

标签: java generics

我正在使用像这样的方法

private static <T> void setPreference(String key, T value)
{
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Controller.getContext());

    SharedPreferences.Editor editor = prefs.edit();

    editor.putString(key, value.toString());

    editor.commit();
}

不幸的是,putString是多种put方法之一。我还想使用putBooleanputInt。我的问题是我想支持特定类型(我不想像我一样将所有内容保存为字符串),并且我希望尽可能减少代码重复。我已经习惯了C#,这种事情非常简单,所以我觉得我错过了一些明显的东西。

2 个答案:

答案 0 :(得分:4)

您可以使用if (value instanceof Boolean) { editor.putBoolean(..); }

但那不是OO。你可以做的是将责任转移到价值对象:

public intarface ValueHolder<T> {
     void putInEditor(String key, Editor editor);
     T getValue();
}

public class StringValueHolder extends ValueHolder<String> {
    private String value;
    // constructor here to initialize the value
    public putInEditor(String key, Editor editor) {
        editor.putString(key, value);
    }

    public String getValue() {
         return value;
    }
}

public class BooleanValueHolder extends ValueHolder<Boolean> {
    private Boolean value;
    // constructor here to initialize the value
    public putInEditor(String key, Editor editor) {
        editor.putBoolean(key, value);
    }

    public Boolean getValue() {
         return value;
    }
}

更加冗长,我同意,所以如果您不想让事情复杂化,请坚持使用instanceof解决方案。

答案 1 :(得分:4)

为您想要创建的每种特定类型制作几个重载:一个接受<T extends Boolean>等的重载。