671 Stimmen

Generischen Typ einer Klasse zur Laufzeit abrufen

Wie kann ich das erreichen?

public class GenericClass<T>
{
    public Type getMyType()
    {
        //How do I return the type of T?
    }
}

Alles, was ich bisher versucht habe, ergibt immer den Typ Object und nicht der verwendete Typ.

420voto

Henning Punkte 15543

Wie bereits von anderen erwähnt, ist dies nur unter bestimmten Umständen durch Reflexion möglich.

Wenn Sie den Typ wirklich brauchen, ist dies das übliche (typsichere) Umgehungsmuster:

public class GenericClass<T> {

     private final Class<T> type;

     public GenericClass(Class<T> type) {
          this.type = type;
     }

     public Class<T> getMyType() {
         return this.type;
     }
}

326voto

FrVaBe Punkte 46058

Ich habe etwas Ähnliches gesehen

private Class<T> persistentClass;

public Constructor() {
    this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
                            .getGenericSuperclass()).getActualTypeArguments()[0];
 }

im hibernate GenericDataAccessObjects Ejemplo

134voto

ewernli Punkte 37122

Generika sind nicht verifiziert während der Laufzeit. Dies bedeutet, dass die Informationen zur Laufzeit nicht vorhanden sind.

Das Hinzufügen von Generika zu Java unter Beibehaltung der Abwärtskompatibilität war eine Meisterleistung (Sie können das bahnbrechende Papier darüber lesen: Die Zukunft für die Vergangenheit sichern: Generizität in der Programmiersprache Java ).

Es gibt eine umfangreiche Literatur zu diesem Thema, und einige Leute sind unzufrieden mit dem aktuellen Stand, einige sagen, dass es eigentlich ein locken. und es besteht keine wirkliche Notwendigkeit dafür. Sie können beide Links lesen, ich fand sie recht interessant.

91voto

Cody A. Ray Punkte 5514

Verwenden Sie Guave.

import com.google.common.reflect.TypeToken;
import java.lang.reflect.Type;

public abstract class GenericClass<T> {
  private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) { };
  private final Type type = typeToken.getType(); // or getRawType() to return Class<? super T>

  public Type getType() {
    return type;
  }

  public static void main(String[] args) {
    GenericClass<String> example = new GenericClass<String>() { };
    System.out.println(example.getType()); // => class java.lang.String
  }
}

Vor einiger Zeit habe ich einige vollwertige Beispiele mit abstrakten Klassen und Unterklassen veröffentlicht aquí .

Hinweis: Dies erfordert die Instanziierung einer Unterklasse de GenericClass damit es den Typ-Parameter korrekt binden kann. Andernfalls gibt es den Typ einfach als T .

50voto

josefx Punkte 15196

Java-Generika werden hauptsächlich zur Kompilierzeit verwendet, was bedeutet, dass die Typinformationen zur Laufzeit verloren gehen.

class GenericCls<T>
{
    T t;
}

wird kompiliert zu etwas wie

class GenericCls
{
   Object o;
}

Um die Typinformationen zur Laufzeit zu erhalten, müssen Sie sie als Argument des Ctors hinzufügen.

class GenericCls<T>
{
     private Class<T> type;
     public GenericCls(Class<T> cls)
     {
        type= cls;
     }
     Class<T> getType(){return type;}
}

Exemple :

GenericCls<?> instance = new GenericCls<String>(String.class);
assert instance.getType() == String.class;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X