merkwürdiges Java-Verhalten:
JLabel label = new JLabel();
label.setText("hallo");
Object o = label;
System.out.println(label.getClass().cast(o).getText()); // es geht
JLabel label = new JLabel();
label.setText("hallo");
Class clazz = label.getClass();
Object o = label;
System.out.println(clazz.cast(o).getText()); // geht nicht
hat jemand Idee, wieso geht das zweite nicht?…
'geht nicht' ist ja mal ne mäßig konkrete fehlermeldung
Eclipse meldet, dass die Methode getText() für klass Object nicht definiert.
Die Java-Klasse "Class" verwendet Generics. Wenn du keinen Typ angibst, wird daher der Typ Object verwendet. Daher liefert dir clazz.cast(o) ein Objekt vom Typ Object, welches natürlich nicht die Methode getText() besitzt.
Folgendes funktioniert hingegen:
JLabel label = new JLabel();
label.setText("hallo2");
Class<? extends JLabel> clazz = label.getClass();
Object o = label;
System.out.println(clazz.cast(o).getText());
Danke für die Antwort! Das Problem ist: ich will die Methode getText() aufrufen überhaupt ohne zu wissen, was für ein Object ist es. Vorausgesetzt - getText() ist da definiert. Im ersten Beispiel geht es. Im letzten muss ich vorher durch "instance of" ermitteln ob es "JLabel" oder was anderes ist. Wie kann ich "instance of" ersparen?
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);
So geht es…
http://www.java-forum.org/de/topic54217_casting-problem.html
Ha! Endlich wissen wir also, wer sich andauernd hinter dem Pseudonym "Anonymer User" verbirgt! [28]