Wie übergibt man eine parametrisierte Klasse als argument

Mein Ziel ist die Entwicklung einer Klasse ausgegeben werden können, ein Objekt der angegebenen Klasse.

public class GetMe<T> {
    public T get() {
        Object obj = generateObject();
        return (T) obj;
    }
}

Nun, ich weiß, das ist nicht möglich wegen zu löschen. So, dann können wir auch in einer Klasse-Instanz und verwenden Sie, dass zu werfen.

public class GetMe<T> {
    public GetMe<T>(Class<T> clazz) {
        this.clazz = clazz;
    }

    public T get() {
        Object obj = generateObject();
        return clazz.cast(obj);
    }
}

Dieser funktioniert Super! Solange die Klasse nicht parametriert werden. Wenn es ist, dann habe ich ein problem.

Darf ich nicht verwenden List<String>.class. Wenn ich den pass in einer ParameterizedType (die in sich selbst ist schwer zu erzeugen), gibt es keine cast Methode zu verwenden.

Gibt es einen Weg aus diesem Sumpf?

  • Es ist ein Weg, zu behalten generics zur Laufzeit, aber was ist generateObject und warum kann es nicht geben ein Objekt vom Typ T?
  • Blick auf diese Beispiele, die helfen könnten: serdom.eu/ser/2007/03/25/...
  • Lassen Sie uns sagen generateObject() ist ein third-party-deserializer. Ich weiß, es ist vom Typ T, weil ich serialisiert es früher, aber die Methode dennoch nur Objekt gibt. Es könnte auch das Ergebnis einer Methode.aufrufen, die nur Objekt gibt.
  • Yochai: Komisch, ich habe versucht zu tun, was genau eines der Beispiele empfohlen ( (Class<T>) paramType.getActualTypeArguments()[0]; ). Leider wird dies oft nicht, da gibt es absolut keine Garantie, dass ein Type ist ein Class. Zum Beispiel List ist ein Type dass Gießmasse zu Class, aber List<String> ist ein Typ, der nicht gewirkt zu Class.
  • Kaufen Sie können nicht erstellen Sie eine Instanz des List<String> sowieso..., die Sie brauchen, um eine tatsächliche Klasse. (new ArrayList<Zeichenfolge>() ) .... Liste<> ist eine Schnittstelle. Sie können eine Einschränkung zu garantieren, es ist ein Objekt: public class GetMe<T extends Object>
InformationsquelleAutor Monkey Boson | 2011-02-12
Schreibe einen Kommentar