Java中无法将对象强制转换为扩展类

14

我在寻找类似问题的时候,却找不到匹配的内容。

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


请发布您正在尝试解析的 JSON。 - Harshit Rathi
如果源不是 MyJSONObject 的实例,就无法进行强制转换。 - kosa
JSONObject来自于这个库:http://www.json.org/javadoc/org/json/JSONObject.html#JSONObject() - Joshua Pinter
@HarshitRathi 我认为实际的JSON在这种情况下并不重要。如果我只是删除强制转换,代码就可以正常工作。我只是想添加一些额外的功能来保持代码DRY。 - Joshua Pinter
@Nambari 你能多解释一下吗?getJSONObject(index)方法会返回一个JSONObject实例。 - Joshua Pinter
这个链接 http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html 可能会对你有所帮助。 - kosa
2个回答

18

jsonClients.getJSONObject(0) 返回一个类型为 JSONObject 的对象,这是您的父类类型。

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

因为您从该方法获取了一个 JSONObject 的实例,并且您无法控制它是如何初始化的,所以您可以在 MyJSONObject 类中添加一个构造函数来创建一个来自父对象的对象:

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

这样使用:

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

你说得对,那就是它返回的内容。我该如何将其转换为MyJSONObject以解锁额外的功能呢? - Joshua Pinter
我认为最容易使用的是 JSONObject 构造函数。 - Szymon
虽然文档中有提到,但我使用了你提供的链接。 - Szymon
1
抱歉,你是对的。非常好用。只是在你的回复中需要修复一个缺失的冒号。Szymon做得很好,谢谢。 - Joshua Pinter
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/42624/discussion-between-josh-pinter-and-szymon - Joshua Pinter
显示剩余2条评论

2
您的问题在于JSONArray内部的对象(我假设JSONArray对象是由库创建的)不包含您定义的MyJSONObject对象。

只有在自己创建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
}

1
在这种情况下,你选择使用辅助类可能是正确的,但是我很想知道如何扩展它以便在需要更多功能时进行构建。 - Joshua Pinter
我担心如果你真的想朝那个方向发展,你必须确保该库使用你的自定义类构建其JSON对象。换句话说,你将不得不获取该库的源代码并自己重写它。 - Lai Xin Chu
真的吗,你认为那是唯一的方法? - Joshua Pinter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接