Casting problem

Status
Nicht offen für weitere Antworten.

3chtcheg

Mitglied
merkwürdiges Java-Verhalten:

hier funktioniert es...

Code:
JLabel label = new JLabel();
label.setText("hallo");
Object o = label;
System.out.println(label.getClass().cast(o).getText()); // es geht


hier funktioniert es nicht...

Code:
JLabel label = new JLabel();
label.setText("hallo");
Class clazz = label.getClass();
Object o = label;
System.out.println(clazz.cast(o).getText()); // geht nicht. 
//Eclipse meldet, dass die Methode getText() 
//für die Klasse Object nicht definiert


hat jemand Idee, wieso das zweite nicht geht?...
 
Klammern

Code:
JLabel label = new JLabel();
label.setText("hallo");
Class clazz = label.getClass();
Object o = label;
System.out.println( (clazz.cast(o)).getText() ); // geht nicht.
//Eclipse meldet, dass die Methode getText()
//für die Klasse Object nicht definiert
 
mit klammern auch nicht.

Es geht nur noch mit Generics :

Code:
Class<? extends JLabel> clazz = label.getClass();

Das problem ist: ich möchte getText() aufrufen, ohne zu wissen was für ein Object ich habe. Unter Voraussetzung, dass die Methode getText() da definiert.
 
Dann nützt dir ein Cast nichts. Da musst du die Methode selbst per Reflection suchen (über das Class-Objekt, da gibt es so Dinge wie "getMethod"...), und dann das Method-Objekt benutzen um die echte Methode aufzurufen.
 
ode ein Interface für alle eigenen Klassen, welches getText() vorschreibt
 
Danke! Mit Reflections war es genau das Richtige..

Code:
JLabel label = new JLabel();
label.setText("hallo");

Class clazz = null;
Method method = null;
String text = "";

try {

clazz = Class.forName(label.getClass().getCanonicalName());

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


try {

method = clazz.getMethod("getText", null);

} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


try {

text = (String) method.invoke(label, null);

} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(text);
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben