无法在Java中强制转换为扩展类

时间:2013-12-06 04:38:53

标签: java android casting extends

我环顾四周寻找类似问题,却找不到与之相符的东西。

我正在尝试扩展内置的JSONObject以添加一些功能,如:

public class MyJSONObject extends JSONObject {

    // Easily return an integer from a JSONObject, handling when the value is null.
    //
    public Integer getIntegerUnlessNull(String key) throws JSONException {
        String key_value = this.getString (key);

        if ( key_value.equals("null") ) {
            return null;

        } else {
            return Integer.parseInt( key_value );
        }
    }
}

然而,当我尝试施放它时,我收到java.lang.ClassCastException错误:

private JSONArray    jsonClients;
        MyJSONObject clientJSONRecord;

clientJSONRecord = (MyJSONObject) jsonClients.getJSONObject(0);

完整的错误消息是:

java.lang.ClassCastException: org.json.JSONObject cannot be cast to com.insightemissions.trak.extensions.MyJSONObject

任何帮助?

干杯,

JP

2 个答案:

答案 0 :(得分:15)

jsonClients.getJSONObject(0)返回类型JSONObject的对象,它是您的父类型。

您无法将其强制转换为继承的类型。它只能以另一种方式工作,即将继承的类转换为父类。这与您的对象无关,它只是继承的工作方式。

因为从方法中获取了JSONObject的实例,并且无法控制它的实例化方式,所以可以在MyJSONObject类中添加一个构造函数,以便从父对象创建一个对象:

public MyJSONObject(JSONObject parent) {
    super(parent.toString());
}

并以这种方式使用它:

JSONObject parent = jsonClients.getJSONObject(0);
MyJSONObject child = new MyJSONObject(parent);

答案 1 :(得分:2)

你遇到的问题是JSONArray(我假设JSONArray对象是由库创建的)内的对象不包含由你定义的MyJSONObject个对象。 / p>

只有在您自己创建JSONArray并使用MyJSONObject个对象填充它时,您的代码才有效。

鉴于你正在努力实现这个"扩展功能",我认为继承是一种过度杀伤。

为什么不使用辅助方法?

public Integer getIntegerUnlessNull(JSONObject, String key) throws JSONException {
    String key_value = object.getString (key);

    if ( key_value.equals("null") ) {
        return null;

    } else {
        return Integer.parseInt( key_value );
    }
}

然后你可以这样做:

Integer getInteger = getIntegerUnlessNull(object, "key");
if (getInteger == null) {
    // if null do something
}