Problem beim variablen class-cast

Thomas_Schuetz79

Grünschnabel
Ich möchte einen variablen Class-Cast durchführen, d.h. ich habe einen String s (z.B. "Long", "Integer" oder "Double") und ein Object o, welches ich in den variablen/ dynamischen Typ s casten will.

Also etwas in der Art:
Code:
(Class.forName(s))o

Es soll aus dem Object o z.B. ein Long gecastet werden, ich weiß den Datentyp aber erst zur Laufzeit, muss daher einen variablen Cast durchführen.

Hat jemand eine Idee.
Gruß Thomas.
 

Franz Degenhardt

Erfahrenes Mitglied
Mit einem direkten Cast geht das meiner Meinung nach nicht.
Du kannst allerdings selbst den Konstruktor aufrufen.
In dem Beispiel die Klassen String und Double mit jeweils dem String-Konstruktor
Code:
        	Class class1  = Class.forName("java.lang.String");
		Constructor c1 = class1.getConstructor(Class.forName("java.lang.String"));
        	Object obj1 = c1.newInstance("Hallo Welt");
        	System.out.println(obj1.getClass());
        	
        	Class class2  = Class.forName("java.lang.Double");
		Constructor c2 = class2.getConstructor(Class.forName("java.lang.String"));
        	Object obj2 = c2.newInstance("123");
        	System.out.println(obj2.getClass());
 

Andibert

Mitglied
du könntes auch mit instanceof arbeiten:

Java:
if(o instanceof Long){
 Long l = (Long) o;
 ...
}else if (o instanceof Integer){
 ....

so sparst du dir den string.
 

Franz Degenhardt

Erfahrenes Mitglied
Jo, instanceof geht auch.
Wenn man von sparen spricht, ist für instanceof evtl interessant, dass es für den Fall dass wenn so 90% der Fälle für instanceof die selbe Klasse liefert, ein einfacher cast auf die Klasse + exception fangen und dann andere casts testen performanter ist.
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 * 
 */
public class DynamicCastExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Object o = "1234";

        double result = convert(o, Double.class);
        System.out.println(result);
    }

    private static <T> T convert(Object value, Class<T> to) {
        try {
            return to.cast(to.getDeclaredMethod("valueOf",
                    new Class[] { String.class }).invoke(null, value.toString()));
        } catch (Exception e) {
            throw new RuntimeException(String.format(
                    "Conversion from %s to %s failed", value.getClass(), to));
        }
    }
}

...wobei das hier viel mehr macht als nur casten. Der Wert wird nämlich konvertiert (wenn möglich)

Gruß Tom
 

Andibert

Mitglied
Magst recht haben...
Aber dann sieht der code so hässlich aus ;)

Hauptsache man nimmt nicht so viele Strings...
besonders wenn man wie ich so ne kleine Rächtshcreibscheche hat, kann das schon sehr lange dauern die Ursache zu finden, wenn ein einfacher Tippfehler dein Programmverhalten ändert.

@thomas
Java:
return to.cast(to.getDeclaredMethod("valueOf",new Class[] { String.class }).invoke(null, value.toString()));
In einem Grundlagenforum ist das ja schon ein wenig brutal.
 
Zuletzt bearbeitet: