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
sollFoo.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/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, verlegen, die Beantwortung meiner eigenen Frage...
Ich finde keine Möglichkeit, es zu tun mit
Class<?>
, aber diese Magische Technik namens super type-Token scheint gut zu funktionieren. Hier ist der aktualisierte code:Den
TypeReference
code gegeben hier, obwohl ich vermute, dass Guice istTypeLiteral
würde genauso gut funktionieren (muss es aber nicht newInstance-code, würden Sie haben, um es zu implementieren).In Ihrem, jetzt aktualisiert, code, können Sie immer noch
aber nicht
Alte Antwort:
ich bin mir nicht sicher, welches problem Sie zu bekommen. Dieser code funktioniert gut.Drucke
Bin ich etwas fehlt?
HashSet<Integer>
nicht nurHashSet
.