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

2022-09-04 02:00:39

我四处寻找类似的问题,但找不到任何与之匹配的问题。

我正在尝试扩展内置的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

有什么帮助吗?

干杯

太平绅士


答案 1

jsonClients.getJSONObject(0)返回作为父类型的类型的对象。JSONObject

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

由于您从该方法获取 的实例,并且无法控制其实例化方式,因此可以向类中添加构造函数以从父对象创建对象:JSONObjectMyJSONObject

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

并以这种方式使用它:

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

答案 2

您遇到的问题是(我假设该对象是由库创建的)中的对象不包含由您定义的对象。JSONArrayJSONArrayMyJSONObject

只有当您自己创建代码并用对象填充它时,您的代码才有效。JSONArrayMyJSONObject

鉴于您试图通过这种“扩展功能”实现的目标,我认为继承是一种过度的杀戮。

为什么不直接使用帮助程序方法呢?

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
}

推荐