simple polimorfismo metodos herencia ejercicios ejemplos definicion clase abstracta java android casting extends

metodos - polimorfismo java



No se puede convertir a una clase extendida en Java (2)

Busqué un problema similar pero no encontré nada que coincida.

Estoy tratando de extender el JSONObject incorporado para agregar algunas funcionalidades, así:

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 ); } } }

Sin embargo, cuando intento lanzarlo, java.lang.ClassCastException error java.lang.ClassCastException :

private JSONArray jsonClients; MyJSONObject clientJSONRecord; clientJSONRecord = (MyJSONObject) jsonClients.getJSONObject(0);

El mensaje de error completo es:

java.lang.ClassCastException: org.json.JSONObject cannot be cast to com.insightemissions.trak.extensions.MyJSONObject

¿Alguna ayuda?

Aclamaciones,

JP


El problema que tiene es que los objetos dentro de JSONArray (presumo que el objeto JSONArray es creado por la biblioteca) no contienen objetos MyJSONObject que usted haya definido.

Su código solo funcionaría si creara el JSONArray usted mismo y lo MyJSONObject con objetos MyJSONObject .

Dado lo que está tratando de lograr con esta "funcionalidad extendida", creo que la herencia es una exageración.

¿Por qué no simplemente usar un método de ayuda?

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 ); } }

Entonces puedes hacer esto:

Integer getInteger = getIntegerUnlessNull(object, "key"); if (getInteger == null) { // if null do something }


jsonClients.getJSONObject(0) devuelve un objeto del tipo JSONObject que es tu tipo padre.

No puedes convertirlo al tipo heredado. Solo funciona de otra manera, es decir, lanzando una clase heredada a una clase padre. Esto no tiene nada que ver con tus objetos en particular, es solo la forma en que funciona la herencia.

Como obtiene una instancia de JSONObject del método y no puede controlar cómo se crea una instancia, puede agregar un constructor a su clase MyJSONObject para crear un objeto a partir del objeto principal:

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

Y úsalo de esta manera:

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