2016-08-04 4 views
7

Wie kann ich java.lang.reflect.Type in Class<T> clazz konvertieren?java.lang.reflect.Type in Klasse konvertieren <T> clazz

Wenn ich eine Methode, als nächstes, die ein Argument von Class<T> hat:

public void oneMethod(Class<T> clazz) {  
    //Impl 
} 

Dann eine andere Methode, die ein Argument von java.lang.reflect.Type hat und es ruft oneMethod(Class<T> clazz) und dafür brauche ich java.lang.reflect.Type type zu Class<T> konvertieren:

public void someMehtod(java.lang.reflect.Type type) { 
    // I want to pass type arg to other method converted in Class<T> 
    otherMethod(¿How to convert java.lang.reflect.Type to Class<T>?); 
} 

Ist es möglich?

Antwort

6

Sie müssen sicherstellen, dass type eine Instanz von Class ist, und dann umwandeln.

if (type instanceof Class) { 
    @SuppressWarnings("unchecked") 
    Class<?> clazz = (Class<?>) type; 
    otherMethod(clazz); 
} 

Natürlich müssen Sie auch den Fall handhaben es keinen Class zu sein.

-1

Meintest du das?

public <T extends Type> void oneMethod(T clazz) { 

} 

public void someMethod(Type type) { 
    oneMethod(type); 
} 
+1

Sie verschieben das Problem nur innerhalb der Methode – NatNgs

1

es seltsam wäre, dass ein Type irgend etwas anderes wäre als ein Class ... Javadoc für Type sagt

Alle bekannten Implementierungsklassen: Klasse

es sei denn, Sie also haben spezielle Bibliotheken, die nicht verwenden ClassType s, können Sie einfach werfen - aber Sie müssen bereit sein für eine mögliche ClassCastException. Vorsicht: Java verwendet undokumentierte Typ-Implementierung, um Generika zu repräsentieren, siehe unten.

Sie können explizit es verarbeiten oder nicht, weil es eine ungeprüfte Ausnahme ist:

Explicit Weise:

try { 
    Class<?> clazz = (Class<?>) type; 
} 
catch (ClassCastException ex) { 
    // process exception 
} 

Implizite Weise:

Class<?> clazz = (Class<?>) type; 

aber die aktuelle Methode werfen könnte .. .


EDIT per @Andy Turners Kommentar:

Vorsicht: Type type = new ArrayList<String>().getClass().getGenericSuperclass(); ergibt etwas, das ein Typ ist, aber keine Klasse. Dieser ist ein ParameterizedType, so können Sie getRawType() Methode verwenden, um die tatsächliche Klasse zu finden, aber andere möglicherweise vorhanden.

+2

z. 'Type type = new ArrayList () .getClass(). GetGenericSuperclass();' ergibt etwas, das ein 'Typ' ist, aber keine' Klasse'. [Ideone Demo] (http://ideone.com/kwdkvj). –

+1

@AndyTurner: Sie haben Recht, es ist eine interne undokumentierte Klasse ... Man muss annehmen, dass es 'ParameterizedType' implementiert und dann' getRawType() 'verwendet, um eine wahre Klasse zu finden. –

+0

@SergeBallesta: Das ist der Punkt.'Type' kann eine Instanz von' Class' sein, oder es kann eine Instanz von 'ParameterizedType',' TypeVariable', 'WildcardType' oder' GenericArrayType' sein. Letztere 4 sind Schnittstellen; Die implementierende Klasse ist nicht relevant. – newacct