2016-06-10 13 views
0

ich würde versuchen, einen JSONparser für gwt zu schreiben.Java - ClassCastException auf downcast

Dazu verwende ich die lib org.json auf der Serverseite und die com.google.gwt.json.client auf der Client-Seite.

Ich baue einige Schnittstellen, um diese zwei lib mit den gleichen Methoden zu nennen.

Ich benutze:

public class JSONObject extends com.google.gwt.json.client.JSONObject implements IJSONObject 
{ 
    ... 
} 

und

public class JSONObject extends org.json.JSONObject implements IJSONObject 
{ 
    ... 
} 

So funktioniert es wie ein sharm, aber es gibt eine Sache, die ich nicht bekommen würde.

Client-side:

JSONParser.parseLenient(sJson).isObject() 

Rückkehr ans Objekt von Typ: "com.google.gwt.json.client.JSONObject"

Und ich versuche, diese zu meinen benutzerdefinierten JSONObject zu werfen und eine ClassCastException erhalten.

Mein benutzerdefiniertes JSONObject erstreckt sich von com.google.gwt.json.client.JSONObject und implementiert mein IJSON-Objekt.

Also wenn ich das Objekt nicht werfen kann, kann ich die Schnittstelle nicht benutzen.

Danke

+1

Nur weil diese Methode einen Verweis auf die übergeordnete Klasse zurückgibt bedeutet es Ihrer Unterklasse ist auch ein. –

+0

Aber ich weiß es ist: P Ich fügte nur Methoden nicht Attribute – Flo

+0

Welcher Teil dieses Codes: 'JSONParser.parseLenient (sJson) .isObject()' verwendet Ihre benutzerdefinierte Klasse? –

Antwort

0

Classcast auf gesenkten

ich glaube, Sie von Superklasse erweitern sollte. Bitte versuchen Sie dies:

public class YourCustomJSON extends com.google.gwt.json.client.JSONValue implement IJSONobject 
{ 
    ... 
} 
+0

Aber ich möchte keinen JSONValue ?! – Flo

2

Sie Classcast sicher bekommen.

Grund:

Sie versuchen, ein Objekt "com.google.gwt.json.client.JSONObject" in ein Objekt "public class JSONObject erstreckt com.google.gwt.json.client.JSONObject" zu werfen , was nicht möglich ist.

Beispiel:

public class TestClassCast { 

public static void main(String[] args) { 

    A a = new A(); 
    B b = new B(); 

    A b1 = b; // This is possible since class B extends class A 

    // B a1 = a; // This is not possible, which you are trying to do in your scenario. 
} 


} 

class A { 
    A(){}; 
} 

class B extends A { 
    B(){}; 
} 
+0

Aber sie sind genau die gleichen, ohne einige Methoden. Kann ich das nicht erzwingen? – Flo

+0

Nein, wir können das nicht erzwingen. –

+0

Haben Sie alternative Ideen, wie kann ich so etwas umsetzen? – Flo

Verwandte Themen