La raison est que le type générique et paramétrable type sont traitées différemment lors de la compilation. L'un est de voir que Eliding les paramètres de type et de l'autre est Eliding arguments de type pendant le processus d'effacement.
Les génériques est ajoutée à Java, en 2004, au sein de la version officielle de J2SE 5.0. DANS un Oracle de la documentation "à l'Aide et à la Programmation des Génériques dans J2SE 5.0", a déclaré
Derrière les Coulisses
Les génériques sont mis en œuvre par le compilateur Java front-end
conversion appelé effacement, qui est le processus de la traduction ou de la
réécriture du code qui utilise les génériques et non génériques de code (qui est, les cartes
la nouvelle syntaxe pour le courant de la JVM de spécification). En d'autres termes, ce
conversion efface tous les génériques des informations de type; toutes les informations
entre crochets est effacé. Par exemple, LinkedList
deviendra LinkedList. Les utilisations de l'autre type, les variables sont remplacées par
la limite supérieure de la variable type (par exemple un Objet), et quand
le code résultant est pas le type correct, un cast vers le type approprié
est inséré.
La clé est dans le processus de Type Erasure. Pas de JVM des modifications ont été apportées à l'appui de médicaments génériques afin de Java ne pas se souvenir de type générique passé de compilation.
Dans ce que l'on appelle le Coût De l'Effacement pubslished par l'Université de la Nouvelle-Orléans a brisé les étapes d'Effacement pour nous:
Les mesures effectuées au cours de type effacement comprennent:
Eliding paramètres de type : Lorsque le compilateur trouve la définition d'un type générique ou de la méthode, il supprime toutes les occurrences de chaque type
paramètre de le remplacer par son la plus à gauche lié, ou d'un Objet si aucune limite
est spécifié.
Eliding arguments de type: Lorsque le compilateur trouve un type paramétré, une instanciation d'un type générique, il supprime le type de
les arguments. Par exemple, le type List<String>
est traduite en List
.
Pour la méthode générique le compilateur est à la recherche pour le générique de la définition de type qui est à gauche les plus liés. Et il signifie littéralement en partant de la gauche et c'est pourquoi la Délimitée Tapé Paramètres s'affiche avant le retour de la méthode type Pour le générique de la classe ou de l'interface, le compilateur est à la recherche d'paramétrée type qui, à la différence de type générique, il n'est pas le plus à gauche de la borne de la définition de la classe, mais au lieu de cela suit celui de la classe. Le compilateur puis supprime le type d'arguments JVM peut le comprendre.
Si vous extrayez la section Annexe de Coût De l'Effacement de papier. Bien démontrer comment le compilateur gère les génériques de l'interface et des méthodes.
Pont Méthodes
Lors de la compilation d'une classe ou d'une interface qui étend une classe paramétrée
ou implémente une interface paramétrable, le compilateur peut-être besoin d'
créer une méthode synthétique, appelé pont de la méthode, dans le cadre de la type
le processus d'effacement. Normalement, vous n'avez pas besoin de vous soucier de pont
méthodes, mais vous pourriez être surpris si l'un apparaît dans une trace de la pile.
Remarque: En outre, le compilateur peut parfois besoin d'inserts synthétiques pont méthodes. Pont Méthodes est partie du type de processus d'effacement. Pont méthodes est responsable de s'assurer que les signatures de méthodes de match après l'effacement. Lire plus à ce sujet à des Effets de Type d'Effacement et de Pont Méthodes
Edit: Comme OP rappelle ma conclusion de "la plus à gauche liée" signifie littéralement les moyens les plus à gauche n'est pas assez solide. (OP a fait état dans sa question qu'il n'est pas intéressé par "je pense", le type de réponse) donc j'ai fait un peu de creuser et trouvé ce GenericsFAQ. Dans l'exemple, il semble que l'ordre des paramètres de type a de l'importance. c'est à dire <T extends Cloneable & Comparable<T>>
devient Cloneable
après enrasure mais pas Comparable
voici un autre exemple directement auprès de Oracle Effacement de Type Générique
Dans l'exemple suivant, le générique de la classe de Nœud utilise un délimitée type de paramètre:
public class Node<T extends Comparable<T>> {
...
}
Le compilateur Java remplace le délimitée paramètre de type T
avec la première classe liée, Comparable
.
Je pense que le plus techniquement correcte est-à-dire le type d'effacement de remplacer le type avec la première classe liée (ou Object
si T
est illimitée) il se trouve que la première classe liée est le plus à gauche tenus à cause de la syntaxe de Java.