2017-04-06 4 views
0

Ich möchte eine Methode erstellen, die einen Objekttyp als Parameter akzeptiert, den ich dann verwenden kann, um ein anderes Objekt zu instanziieren.Generischer Typ als Methodenargument

Zum Beispiel passieren in Typ String das Verfahren und innerhalb der Methode Körper, tun

List<String> l = new ArrayList<String>(); 
String s = new String("abc"); 

Wie gehe ich um dies zu tun?

Edit:

How to have Java method return generic list of any type? den ersten Teil meiner Frage nicht beantworten.

Könnte ich als Follow-up eine Instanz des übergebenen Typs innerhalb des Methodenrumpfs erstellen, wie in der zweiten Zeile im Code-Snippet oben?

+0

Es gibt viele Tutorials über Generika in Java ... haben Sie mindestens einen von ihnen versucht? – Tom

+0

Ich habe ein paar Tutorials gelesen, die mir geholfen haben, Code zu implementieren, der Generika verwendet. Leider kann ich dieses spezielle Problem nicht erkennen. Ein Link, wenn möglich, würde sehr geschätzt werden. – user1889776

+0

Nun, eines der ersten Dinge, die Sie gelernt haben müssen, wenn Sie Generika gelernt haben, war, dass Sie 'new' nicht mit einem generischen Typ aufrufen können, da generische Typen zur Laufzeit nicht existieren. – RealSkeptic

Antwort

1

Es gibt keinen Mechanismus, um das nur mit Generika zu bekommen. Sie müssen Reflektion verwenden, um das zu bekommen.

public <T> T instantiator(Class<T> c){ 
    if (c != null){ 
     try { 
      return (T) c.getConstructor().newInstance(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

Die Reflektionen können jedoch fehlschlagen, wenn sie nicht sorgfältig verwendet werden. Diese Methode, die ich gerade geschrieben habe, funktioniert gut, wenn die Klasse einen Konstruktor ohne Parameter hat. Beispielsweise würden und instantiator(Exception.class); ordnungsgemäß funktionieren, da der leere Konstruktor instantiator(Integer.class) nicht ausgeführt wird.

+0

Die SO-Frage, die @Tom mit oben verknüpft hat beantwortet den ersten Teil meiner Frage, dies beantwortet den zweiten Teil. – user1889776