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