2010-03-22 5 views
0

Ayant ces interface générique et la classe:Java génériques récursive générique de classe correspondant à

interface TestIntf<T extends TestIntf<T>> 
{ 
    void test(T param); 
} 

class TestImpl<T extends TestIntf<T>> implements TestIntf<T> 
{ 
    @Override 
    public void test(T param) { System.out.println(param); } 
} 

Cela échoue:

Class<? extends TestIntf<?>> clz = TestImpl.class; 

(Type mismatch: ne peut pas convertir Class<TestImpl>-Class<? extends TestIntf<?>>)

Pourquoi? Comment fournir correctement une référence à la classe TestImpl pour correspondre à Class<? extends TestIntf<?>>?

Répondre

4

Vous ne pouvez pas. Utilisez un casting dangereux.

Class<? extends TestIntf<?>> clz = (Class<? extends TestIntf<?>>) TestImpl.class; 

ou ne pas utiliser les génériques internes:

Class<? extends TestIntf> clz = TestImpl.class; 

Mise à jour: Quand il considère les annotations, il n'y a rien que vous pouvez faire - l'annotation doit être changé. Vous ne pouvez pas avoir un littéral de classe représentant un type générique. Que faire si la référence de classe est requise dans l'annotation?

+0

compilateur se conforme sur le catalogué là. – pingw33n

+0

@ pingw33n vérifier ma mise à jour – Bozho

+0

Voir les documents API pour 'Object.getClass' (le bit en gras). –

Questions connexes