2013-12-06 4 views
11

Я огляделся по той же проблеме, но не смог найти ничего, что бы соответствовало ей.Невозможно передать в расширенный класс в 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

+0

Пожалуйста, ваши JSON, которые вы пытаетесь разобрать .... –

+0

Если источник не является реальным примером MyJSONObject, не представляется возможным, чтобы бросить , – kosa

+0

JSONObject получен из этой библиотеки: http://www.json.org/javadoc/org/json/JSONObject.html#JSONObject() –

ответ

15

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

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

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

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

И использовать его таким образом:

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

Вы правы, вот что возвращается.Как мне превратить его в MyJSONObject, чтобы разблокировать дополнительные функции? –

+0

Проверьте мое обновление. – Szymon

+0

Хм ... ладно, что имеет смысл, кроме почему 'parent.toString()'? –

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

В этом конкретном случае вы, вероятно, правы с идеей Вместе со вспомогательным классом я хотел бы узнать, как расширить его с большей функциональностью в случае, если мне нужно больше на нем строить. –

+0

Я боюсь, если вы действительно хотите пойти в этом направлении, вы должны убедиться, что библиотека создает свои объекты JSON, используя ваш собственный класс. Другими словами, вам придется приобрести исходный код библиотеки и переписать ее самостоятельно. –

+0

Действительно, это единственный способ, как вы думаете? –

Смежные вопросы