2009-11-13 8 views
8

Ich brauche eine Methode, die eine Instanz der angegebenen Klassenart zurückgibt. Nehmen wir an, dass die bereitgestellten Typen darauf beschränkt sind, dass eine "leere" Instanz von ihnen erstellt werden kann. Wenn Sie beispielsweise String.class bereitstellen, wird ein leerer String zurückgegeben, und ein Integer.class liefert eine Ganzzahl, deren Anfangswert gleich Null ist. Aber wie erstelle ich (boxed) primitive Typen im laufenden Betrieb? So was?Erstellen (boxed) primitive Instanz, wenn die Klasse bekannt ist

Ist die einzige Lösung, um alle möglichen primitiven Typen zu durchlaufen, oder gibt es eine einfachere Lösung? Beachten Sie, dass beide

int.class.newInstance() 

und

Integer.class.newInstance() 

Wurf ein InstantiationException (weil sie nicht über nullary Bauer).

Antwort

12

Ich vermute, dass der einfachste Weg, um eine Karte zu haben ist:

private final static Map<Class<?>, Object> defaultValues = 
    new HashMap<Class<?>, Object>(); 
static 
{ 
    defaultValues.put(String.class, ""); 
    defaultValues.put(Integer.class, 0); 
    defaultValues.put(int.class, 0); 
    defaultValues.put(Long.class, 0L); 
    defaultValues.put(long.class, 0L); 
    defaultValues.put(Character.class, '\0'); 
    defaultValues.put(char.class, '\0'); 
    // etc 
} 

Glücklicherweise alle diese Arten sind unveränderlich, so dass es einen Verweis zurück auf das gleiche Objekt bei jedem Aufruf für den gleichen Typ ist okay.

+0

@Joonas: Schau jetzt noch mal :) –

+0

Danke! Das könnte funktionieren :) –

+0

Ich denke, ich würde für eine?: Kette gehen. 'type == long.class? (Long) 0L: 'usw. –