2010-10-19 6 views
3

J'essaie de comprendre comment référencer une interface paramétrés comme un attribut d'annotation:Référencer un type paramétrées d'une annotation

public class Example { 
    public interface MyService<T extends Number> { 
     T someNumber(); 
    } 

    public class BaseServiceImpl<T extends Number> implements MyService<T> { 
     @Override 
     public T someNumber() { 
      return null; 
     } 
    } 

    public @interface ServiceType { 
     Class<? extends MyService<?>> value(); 
    } 

    @ServiceType(BaseServiceImpl.class) 
    public static void main(String[] args) { 
     System.out.println("Hello World"); 
    } 
} 

Le code ci-dessus échoue avec un décalage de type sur l'annotation @ServiceType. Je crois que le problème est avec les limites que j'ai indiquées pour l'attribut value. J'ai aussi remarqué que quand un type n'est pas générique ça fonctionne bien; par exemple. @ServiceType(IntegerService.class) travaux donnés:

public class IntegerService extends BaseServiceImpl<Integer> { /* ... */ } 

Qu'est-ce que je manque pour obtenir le débarrasser de l'erreur de décalage en essayant de fournir le type générique?

Répondre

0

Je pense que l'interface annotée devrait délimitée comme suit:

 
public @interface ServiceType { 
     Class<? extends MyService<? extends Number>> value(); 
} 
3

Le problème est que les littéraux de classe se réfèrent à des types de classe premières. C'est BaseServiceImpl.class est de type Class<BaseServiceImpl>, pas Class<BaseServiceImpl<? extends Number>>. Changez le type de valeur de retour en Class<? extends MyService> et il doit compiler.