2010-06-13 13 views
7

Ich habe die folgende KlasseDen Typ eines parametrisierten Klassenparameters erhalten?

public class MyClass<T> { 
    public Class<T> getDomainClass() { 
      GET THE CLASS OF T 
    } 
} 

ich dieses Problem gegoogelt habe und alle Antworten, die ich mir gesagt, finden konnte getGenericSuperClass() zu verwenden, aber das Problem dieser Methode ist, dass ich eine zweite Klasse haben muss, dass erweitert MyClass und ich möchte das nicht tun. Was brauche ich, um den parametrisierten Typ einer konkreten Klasse zu bekommen?

+0

Haben Sie gesehen: http://stackoverflow.com/questions/1901164/get-type-of-a-generic-parameter-in-java-with-reflection? – Campa

Antwort

5

Sie können nicht. Die gewünschte Information (d. H. Der Wert von T) ist zur Laufzeit aufgrund von Typlöschung nicht verfügbar.

0

Wenn Sie den Typ wissen müssen, sollten Sie Generika wahrscheinlich nicht verwenden.

3

Aufgrund der Art des Löschens ist die einzige Möglichkeit, sie zu erhalten, wenn sie als expliziter Parameter übergeben wird - entweder in einer Methode oder im Konstruktor.

public class MyClass<T> { 
    public Class<T> getDomainClass(Class<T> theClass) { 
      // use theClass 
    } 
} 
3

Der einzige Weg, ich kenne:

public class MyClass<T> { 

    private Class<T> clazz; 

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

    public Class<T> getDomainClass() { 
     return clazz; 
    } 
} 

Also im Grunde Sie die Laufzeit der Informationen zur Verfügung stellen, es vom Compiler nicht hat.

1

Sie können es tun, wenn Sie einen generischen Typ erhalten möchten, den Sie erben! Fügen Sie diese Methode zu Ihrer Klasse hinzu und profitieren Sie davon! ;)

public Class<?> getGenericType() { 
    Class result = null; 
    Type type = this.getClass().getGenericSuperclass(); 

    if (type instanceof ParameterizedType) { 
     ParameterizedType pt = (ParameterizedType) type; 
     Type[] fieldArgTypes = pt.getActualTypeArguments(); 
     result = (Class) fieldArgTypes[0]; 
    } 

    return result; 
} 
Verwandte Themen