Envoyé par
Ithildine
Certes, mais pourquoi l'appel est-il accepté dans la méthode method2B et refusé dans la méthode method2A alors que la définition du type de arg me semble totalement équivalente dans ces deux méthodes (à l'exception de la désignation possible de ce type dans le corps de la méthode method2B grace au paramètre formel E) ?
Dans le deuxième appel, méthode method2B, l'appel qui aura effectivement lieu après résolution est (on se base sur les paramètres de la méthode!):
Class<E> create (Class<? super E>)
et comme pas définition class<E> extends ClassA, on peut attribuer la valeur de retour à object sans problème.
Dans le method2A, les règles sont légèrement différentes (à cause du ?) pour déterminer les type. ? étant imprécis, on ne peut pas se baser dessus pour type l'appel. On regarde la valeur de retour attribuée pour essayer de déterminer le type de l'appel. On obtiens alors:
Class<A> create(Class<? super A>)
mais <? extends Class> ne peut pas être converti en <? super A> ! D'ou l'erreur.
Si je dis des conneries, adiGuba me corrigera
Partager