Java: Generische Typen in einer Typ-token

Habe ich eine Klasse, die einen Typ token und erzeugt dann Objekte von einem Typ parametrisiert, den Typ (OK, es ist ein bisschen komplizierter als das, aber das ist ein prägnantes Beispiel):

public class Test {

    public static void main(String[] args) throws Exception {
        Holder<HashSet<Integer>> i = newObjectHolder(HashSet.class);  //this fails
    }

    static class Holder<T> {
        public Holder(T newInstance) {}
    }

    public static <T> Holder<T> newObjectHolder(Class<T> typeToken) throws Exception {
        Constructor<T> ctor = typeToken.getConstructor();
        return new Holder<T>(ctor.newInstance());
    }
}

Dies funktioniert gut, wenn Sie überschritten wird, nicht-generische Typen, wie:

Holder<Integer> i = Test.newObjectHolder(Integer.class);

Wenn der übergebene Typ token ist generisch, aber es funktioniert nicht, wie in der angegebenen Zeile oben:

Holder<HashSet<Integer>> i = Test.newObjectHolder(HashSet.class);  //this fails

Bekomme ich das problem, aber gibt es eine Lösung? Ich bin OK zum hinzufügen von @SuppressWarnings("unused") in den code für newObject, wenn es nicht reduzieren die Sicherheit. Intuitiv, so scheint es, dass newObject sollten in der Lage sein, um eine Besetzung, die funktioniert, wissen wir, dass ein "neues" Objekt gelöscht generischen Typ ist das gleiche wie jeder andere, und wir haben noch nicht anderweitig verwendet werden T in der Methode.

  • Das war ein Fehler, eingeführt während meiner "make prägnant" - phase von den wirklichen code. Let me fix it.
  • Behoben. Beachten Sie, dass es immer noch nicht funktioniert.
  • Ist der Aufruf Foo.newObject soll Foo.newObjectHolder?
  • Ja, mein Beispiel war uneinheitlich nach früheren Bearbeitungen zu beheben Probleme, die durch Nishant. Ich habe aktualisiert es jetzt mit einem sscce.org
  • Siehe stackoverflow.com/questions/2012306/...
InformationsquelleAutor BeeOnRope | 2012-03-02
Schreibe einen Kommentar