2017-08-05 5 views
3

Disons que j'ai une méthode avec la signature suivante:Pourquoi une distribution est-elle nécessaire dans ce cas?

public static <T> Set<Class<? extends T>> dosomething(Class<T> clazz) 

Si j'ai essayé d'appeler cette aide d'une classe générique, comme dans l'exemple ci-dessous

Class<?> clazz = Integer.class 
Set<Class<?>> result = dosomething(clazz); 

Le compilateur se plaint de ce qui suit: Le correctif pour cela consiste donc à ajouter un cast dans l'appel de la méthode.

Set<Class<?>> result = (Set<Class<?>>) dosomething(clazz); 

Je me demande pourquoi est-ce que le casting est nécessaire dans ce cas particulier et s'il y a une solution de contournement pour éviter la coulée ... J'utilise pour ce java-8. Merci

+1

Je pense que le compilateur ne sait pas que la classe va étendre T. –

Répondre

1

Le problème semble être le paramètre de type générique dans Set<Class<?>> result, alors que votre méthode retourne Set<Class<? extends T>>

Ainsi, le résultat pourrait contenir des classes d'objets de tout type (sous-types d'objet), la méthode renvoie uniquement les objets sont des sous-types de T (comme mentionné dans l'erreur du compilateur).

Soit ce

public static void main(String[] args) { 
    Class<?> clazz = Integer.class; 
    Set<Class<?>> result = dosomething(clazz); 
} 

public static <T> Set<Class<?>> dosomething(Class<T> clazz){ 
    return new HashSet<Class<?>>(); 
} 

ou cette

public static void main(String[] args) { 
    Class<Integer> clazz = Integer.class; 
    Set<Class<? extends Integer>> result = dosomething(clazz); 
} 

public static <T> Set<Class<? extends T>> dosomething(Class<T> clazz){ 
    return new HashSet<Class<? extends T>>(); 
} 

fonctionnera sans erreur.

Dans votre code, en raison de l'effacement de type le compilateur ne peut pas être sûr que votre code est correct à l'exécution et se plaint donc.