2016-11-19 3 views
1

Wie erhalten Sie Klassenname des Typs Parameter Objekt?Wie bounded generische Typparameter Klasse als Argument übergeben

Beispiel: Wenn Funktion ist

public <T extends Base> void convert(final T arg) {} 
public <T> void method2(Class<T> typeParamClass) {} 

Wie gehe ich arg als Class<T> zu Methode 2?

Fehlermeldung, wenn ich versuche, arg.getClass()

Real-Code Snippet

static <T> byte[] method2(T object, final Class<T> typeParameterClass) throws SerializationException { 
} 


static <T> T method3(final byte[] serializedObject, final Class<T> typeParameterClass) throws SerializationException { 
     return (T) serializer.deserialize(typeParameterClass, Buffers.toBuffer(serializedObject)); 
    } 
} 

public static <T> T clone(final T object) { 
    return method3(method2(object, object.getClass()), object.getClass()); 
} 

enter image description here

+0

Bitte klären, ** was ** * andere * Methode? –

+0

@ user3089214: Bitte geben Sie eine [mcve] an. –

+2

Warum deklariert 'method2' sogar einen Typparameter? Es scheint hier bedeutungslos. –

Antwort

3
public <T> void method2(Class<T> typeParamClass) 

passieren Wenn Sie die zweite Methode generisch machen, werden Sie in der Lage sein, wie

public <T extends Base> void convert(final T arg) { 
    method2(arg.getClass()); 
} 
012 aufrufen

Es gibt keine Einschränkungen für T in der method2 (T extends Object), so dass Sie frei T (einschließlich T extends Base) übergeben können.

Wie Sotirios Delimanolis erwähnt, T ist hier wirklich sinnlos und das Verfahren kann einfach definiert werden:

public void method2(Class<?> typeParamClass) 

UPDATE:

method2(object, object.getClass()) 
         ^^^ 

Das Hauptproblem dabei ist, dass getClass() ein virtuell Methode gibt einen Laufzeittyp einer Instanz zurück. Es kann nicht garantiert werden, dass ein Class<T> von dem angegebenen T zurückgegeben wird, aber ? extends T es kann. Um es kompilieren zu können, müssen Sie die Signatur ändern in:

method2(T object, final Class<? extends T> typeParameterClass) 
           ^^^ 
+0

Ich aktualisierte meine Frage mit der richtigen Signatur von method2. Ich kann method2 signature und method2 nicht ändern (arg.getClass()); funktioniert nicht – user3089214

+1

@ user3089214: Wie funktioniert es nicht? Es scheint in diesem Testfall zu funktionieren: http://ideone.com/itdAIU –

+0

Gettinr-Fehler (java.lang.Class ) kann nicht angewendet werden (java.lang.Class >) – user3089214

Verwandte Themen