2017-09-25 5 views
0

J'ai une question sur les variances Scala.Variable invalide dans l'utilisation de val - erreur: le type contravariant U se produit dans la position covariant

Le code ci-dessous est un code valide, qui passe la compilation.

// <Code A> 
// VALID (COMPILE PASS!) 
class A[+T, -U](t: T, u: U) 

Mais le code ci-dessous n'est pas valide, qui utilisent val et ne passe pas la compilation.

// <Code B> 
// INVALID (COMPILE ERROR) 
class A[+T, -U](val t: T, val u: U) 

Le message d'erreur est le suivant.

error: contravariant type U occurs in covariant position in type => U of value u 
class A[+T, -U](val t: T, val u: U) 
           ^

Je me demande pourquoi <Code A> est valide et <Code B> est pas valide. Quelqu'un pourrait-il me dire la raison?

Répondre

2

Vous avez déclaré U comme étant contravariant (c'est ce que signifie -U). Une autre façon de penser à la contravariance est qu'il s'agit d'un «type d'entrée». c'est à dire. Le type peut être utilisé en tant que paramètre pour les méthodes, mais pas en tant que valeur de retour. En le déclarant val, il est maintenant accessible en dehors de la classe en tant que «valeur de sortie». Cela brise la règle de la contravariance.

Si vous souhaitez U un val, vous devez le rendre covariant (+U) si possible, ou si vous avez besoin qu'il soit aussi une entrée, il doit être rendu invariable.

+0

Merci pour votre réponse! – redstone