Подтвердить что ты не робот

Невозможно использовать расширенный класс в Java

Я огляделся по той же проблеме, но не смог найти ничего, что бы соответствовало ей.

Я пытаюсь расширить встроенный 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

4b9b3361

Ответ 1

jsonClients.getJSONObject(0) возвращает объект типа JSONObject, который является вашим родительским типом.

Вы не можете передать его унаследованному типу. Он работает только по-другому, т.е. Отбрасывает унаследованный класс родительскому классу. Это не имеет ничего общего с вашими объектами, это просто способ наследования.

Поскольку вы получаете экземпляр JSONObject из метода, и вы не можете управлять его созданием, вы можете добавить конструктор в свой класс MyJSONObject для создания объекта из родительского объекта:

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

И используйте его так:

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

Ответ 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
}