Невозможно использовать расширенный класс в 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
Ответы
Ответ 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
}