Java 将对象强制转换为列表时的ClassCastException<;字符串>;

Java 将对象强制转换为列表时的ClassCastException<;字符串>;,java,android,classcastexception,Java,Android,Classcastexception,我正在开发和Android应用程序,我已经实现了一个类,用于处理所有共享首选项。这个类拥有一个获取首选项的通用方法,它的通用性在于它根据参数返回不同类型的数据类型。我存储到共享pref并从中检索的数据类型有integer、string、boolean和List(使用JSON将List序列化/反序列化为字符串)。 好吧,一切都很好,我可以通过这种方式成功地从共享首选项中获取int、string和boolean,但不能获取列表,因为我得到了一个: java.lang.ClassCastExcepti

我正在开发和Android应用程序,我已经实现了一个类,用于处理所有共享首选项。这个类拥有一个获取首选项的通用方法,它的通用性在于它根据参数返回不同类型的数据类型。我存储到共享pref并从中检索的数据类型有integer、string、boolean和List(使用JSON将List序列化/反序列化为字符串)。 好吧,一切都很好,我可以通过这种方式成功地从共享首选项中获取int、string和boolean,但不能获取列表,因为我得到了一个:

java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List
我忘了告诉你方法被声明为返回一个对象,当它被调用时,返回的值被类型转换为正确的类型。 无论如何,我不明白为什么它说不能转换字符串,它甚至不返回字符串?这是一个正确的方法吗,我的意思是返回一个对象,然后投射它是完全正确的

下面是获取共享首选项的完整方法。谢谢你的建议

public Object getPrefs(String sharedPreferences, String key, int type,
        Context context, Object defaultObject) {
    // A String indicating an error occurred while retrieving shared
    // preferences
    final String ERROR = "ERROR";

    // Set shared preferences from context
    sharedPref = context.getSharedPreferences(sharedPreferences,
            Context.MODE_PRIVATE);

    switch (type) {
    case (0): // <-- Integer
        // Check that defaultObject is of correct instance else collect
        // "hardcoded" default value of 0
        if (defaultObject instanceof Integer) {
            this.logger.logCatTxt(
                    this.logger.getINFO(),
                    this.LOG_TAG + ":getPrefs()",
                    "Integer with value"
                            + Integer.toString(sharedPref.getInt(key,
                                    (Integer) defaultObject))
                            + " retrieved from shared preferences: "
                            + sharedPreferences + ", with key: " + key
                            + ", type: " + Integer.toString(type)
                            + ", context: " + context.toString()
                            + " and default value: "
                            + Integer.toString((Integer) defaultObject));
            return sharedPref.getInt(key, (Integer) defaultObject);
        } else {
            this.logger
                    .logCatTxt(
                            this.logger.getERROR(),
                            this.LOG_TAG + ":getPrefs()",
                            "Default value couldn't be set because of instance mismatch, hardcoded default value of 0 is used. However Integer with value"
                                    + Integer.toString(sharedPref.getInt(
                                            key, 0))
                                    + " retrieved from shared preferences: "
                                    + sharedPreferences
                                    + ", with key: "
                                    + key
                                    + ", type: "
                                    + Integer.toString(type)
                                    + ", context: "
                                    + context.toString()
                                    + " and default value: "
                                    + Integer
                                            .toString((Integer) defaultObject));
            return sharedPref.getInt(key, 0);
        }
    case (1): // <-- String
        // Check that defaultObject is of correct instance else collect
        // "hardcoded" default value of ""
        if (defaultObject instanceof String) {
            this.logger.logCatTxt(
                    this.logger.getINFO(),
                    this.LOG_TAG + ":getPrefs()",
                    "String with value"
                            + sharedPref.getString(key,
                                    (String) defaultObject)
                            + " retrieved from shared preferences: "
                            + sharedPreferences + ", with key: " + key
                            + ", type: " + Integer.toString(type)
                            + " and context: " + context.toString()
                            + " and default value: "
                            + (String) defaultObject);
            return sharedPref.getString(key, (String) defaultObject);
        } else {
            this.logger
                    .logCatTxt(
                            this.logger.getERROR(),
                            this.LOG_TAG + ":getPrefs()",
                            "Default value couldn't be set because of instance mismatch, hardcoded default value of \"\" is used. However String with value"
                                    + sharedPref.getString(key, "")
                                    + " retrieved from shared preferences: "
                                    + sharedPreferences
                                    + ", with key: "
                                    + key
                                    + ", type: "
                                    + Integer.toString(type)
                                    + " and context: " + context.toString());
            return sharedPref.getString(key, "");
        }
    case (2): // <-- Boolean
        // Check that defaultObject is of correct instance else collect
        // "hardcoded" default value of false
        if (defaultObject instanceof Boolean) {
            this.logger.logCatTxt(
                    this.logger.getINFO(),
                    this.LOG_TAG + ":getPrefs()",
                    "Boolean with value"
                            + sharedPref.getBoolean(key,
                                    (Boolean) defaultObject)
                            + " retrieved from shared preferences: "
                            + sharedPreferences + ", with key: " + key
                            + ", type: " + Integer.toString(type)
                            + " and context: " + context.toString()
                            + " and default value: "
                            + (Boolean) defaultObject);
            return sharedPref.getBoolean(key, (Boolean) defaultObject);
        } else {
            this.logger
                    .logCatTxt(
                            this.logger.getERROR(),
                            this.LOG_TAG + ":getPrefs()",
                            "Default value couldn't be set because of instance mismatch, hardcoded default value of false is used. However Boolean with value"
                                    + sharedPref.getBoolean(key, false)
                                    + " retrieved from shared preferences: "
                                    + sharedPreferences
                                    + ", with key: "
                                    + key
                                    + ", type: "
                                    + Integer.toString(type)
                                    + " and context: " + context.toString());
            return sharedPref.getBoolean(key, false);
        }
    case (3): // <-- List
        // Retrieve secondaryListenNumbers to json string and clear
        // secondaryListenNumbers List just to be sure that it's empty
        String json = sharedPref.getString(key, "");
        // List of Strings containing
        List<String> list = new ArrayList<String>();

        // If json string is not empty
        if (json != "") {
            try {
                // Create a JSONArray from json string and retrieve strings
                // from it and and them to secondaryListenNumbers List
                JSONArray a = new JSONArray(json);
                for (int i = 0; i < a.length(); i++) {
                    String secondaryListenNumber = a.optString(i);
                    list.add(secondaryListenNumber);
                }
                this.logger.logCatTxt(this.logger.getINFO(), this.LOG_TAG
                        + ":getPrefs()", "List<String> with value(s)" + json
                        + "   retrieved from shared preferences: "
                        + sharedPreferences + ", with key: " + key
                        + ", type: " + Integer.toString(type)
                        + " and context: " + context.toString());
                // Return the list
                return list;
            } catch (JSONException e) {
                e.printStackTrace();
                this.logger.logCatTxt(this.logger.getERROR(), this.LOG_TAG
                        + ":getPrefs()",
                        "Failed to retrieve List<String> from shared preferences: "
                                + sharedPreferences + ", with key: " + key
                                + ", type: " + Integer.toString(type)
                                + " and context: " + context.toString(), e);
            }
        }
        break;
    default:
        this.logger.logCatTxt(this.logger.getWARN(), this.LOG_TAG
                + ":getPrefs()",
                "Unsupported data type was givien as parameter. Shared preferences: "
                        + sharedPreferences + ", with key: " + key
                        + ", type: " + Integer.toString(type)
                        + " and context: " + context.toString());
    }

    // We should never reach this far but if we do an error has occurred and
    // we return the ERROR string
    return ERROR;
}
公共对象getPrefs(字符串共享引用、字符串键、int类型、, 上下文,对象(默认对象){ //一个字符串,指示检索共享时出错 //偏好 最后一个字符串ERROR=“ERROR”; //从上下文设置共享首选项 sharedPref=context.getSharedPreferences(sharedPreferences, 上下文。模式(私人); 开关(类型){
案例(0)://您正在使用非相等运算符比较字符串:
if(json!=”)
您应该使用
if(!“”.equals(json))


如果json为空,则返回一个字符串错误。如果尝试强制转换到列表,则会导致异常。

是,您的方法可以返回一个
字符串:

return ERROR;
return sharedPref.getString(key, (String) defaultObject);
它被声明为
字符串

final String ERROR = "ERROR";
此外,这可能会返回一个
字符串

return ERROR;
return sharedPref.getString(key, (String) defaultObject);
可能相关:

if (json != "") {
不要将字符串值与
=
!=
进行比较。使用
string#equals
,即

if (!json.equals("")) {
甚至这个:

if (json.isEmpty()) {
在Java中,如果出现错误,则返回错误
字符串
,这不是一个好的设计

如果出现错误,最好抛出某种类型的
异常
,并让调用方法捕获异常并处理错误

java.lang.String cannot be cast to java.util.List
错误字符串表示:您正试图将字符串强制转换为列表。
使用调试器找到它。

如果返回类型是
对象
,则在转换到另一个类型时使用
InstanceOf
是一个好主意。正如前面提到的,不要返回错误字符串,最好抛出一个
异常

您发布了太多的代码。发生错误的原因是您试图分配一个
字符串
到一个
列表
。对此我很抱歉。有时代码太少,有些代码太多。从错误中不难找出错误发生的原因,问题是我没有找到字符串的来源…我现在觉得很愚蠢,因为我没有更早地捕捉到它…我将重构metod以抛出一个异常如果有错误而不是字符串,则启用。