<T>.getClass

Status
Nicht offen für weitere Antworten.
Folgender Code compiliert nicht

Code:
    private static <T> T createNewIfNull( T obj) throws Exception
    {
        if(  obj != null)
        {
            return  obj;
        }
        else
        {
            return  obj.getClass().newInstance();   //<-- Fehler:   Type mismatch: 
                                                                   //cannot convert from capture-of ? extends Object to T
        }
    }

Kann man das irgendwie hinkriegen: ein Objekt von einem generisch übergebenen Typen instanziieren?

PS: T.class.getInstance() liefert auch einen Fehler: illegal type literal
 

byte

Top Contributor
Geht nicht, weil die Typinformation über T nach dem Kompilieren nicht mehr vorhanden ist. Du kannst Dir das so vorstellen, dass zur Laufzeit statt T überall Object steht.
 
aber kann man nicht trotzdem irgendwie an den eigentlichen Typ rankommen?

Hm könnte ich vielleicht den Klassennamen erfragen und die Klasse vom classloader laden lassen ?
 
S

SlaterB

Gast
die von dir verwendete Version
obj.getClass().newInstance();
kompiliert bei mir,

hast du wirklich noch die Fehlermeldung?
wenn ich den Rückgabetyp in String ändere kommt bei mir
> Type mismatch: cannot convert from capture-of ? extends T to String

aber Cast auf T geht tadellos,

evtl. noch (T) obj.getClass().newInstance(); versuchen?

---------

das ganze ist aber eh nur ein theoretisches Problem,
denn du willst das ganze ja nur dann ausführen, wenn das Objekt null ist,
das geht nicht, null hat keine Klasse, kann auf beliebigen Typ gecastet werden, da kommst du nicht weit,

-------

viellecht
Code:
 private static <T> T createNewIfNull(T obj, Class c) throws Exception {
        if (obj != null) {
            return obj;
        } else {
            return (T) c.newInstance();
        }
    }
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben