2016-08-22 4 views
1

dans la programmation Scala 2ème édition dans la section 19.5 dans l'exemple suivantvariance de type Scala sur des bornes inférieures

class Queue[+T] (private val leading: List[T], 
     private val trailing: List[T]) { 
    def enqueue[U >: T](x: U) = 
     new Queue[U](leading, x :: trailing) // ... 
} 

T devrait se retrouver à la position négative comme ci-dessous

def enqueue[U- >: T-](x: U-) = 
      new Queue[U](leading, x :: trailing) // ... 

Mais le livre mentionne qu'il y sont 2 flips

Techniquement, ce qui se passe est un flip se produit pour les limites inférieures. Le paramètre de type U est dans une position négative (1 flip), tandis que la borne inférieure (>: T) est dans une position positive (2 flips).

Comment 2 flips se produisent ici?

Répondre

1

Dans enqueue, T est pas un paramètre de type, mais une référence à un élément de type de contexte externe. Il n'est donc pas correct de dire "T devrait se retrouver en position négative".

Peut-être que vous pourriez penser de la référence à T comme la limite inférieure de U comme un « appel de méthode qui donne T », seulement il est un « appel de type », donc T est en quelque sorte dans un « type de retour » ou covariant position.

La phrase suivante est importante:

Intuitivement, si T est un type plus spécifique que prévu (par exemple, Apple au lieu de Fruit), un appel à append fonctionne toujours, parce que U (Fruit) sera toujours un supertype de T (Apple).

+0

S'il s'agit d'un appel de type, le clapet de classification se produit-il? Je ne pouvais pas comprendre/obtenir comment 2 flips se produit pour T – Pushparaj

+0

@Pushparaj ces "flips" ne sont rien d'autre qu'un mécanisme interne dans le compilateur je suppose. Peut-être que c'est un flip pour entrer une déclaration de méthode et l'autre pour faire référence à un paramètre de constructeur de type. –