Considérez l'extrait suivant:Impossible déduire paramètre contravariante type Rien
trait X[-T]
object Y extends X[Nothing]
def a[T](x: X[T]): X[T] = x
a(Y)
Compilation de ce qui précède (2.12.3) échoue avec:
type mismatch;
found : Y.type
required: X[T]
a(Y)
^
Cette compile bien si:
- un type différent de
Nothing
est utilisé (par exempleobject Y extends X[String]
) - la méthode
a
n'utilise pasT
dans son type de retour (par ex.def a[T](x: X[T]): Unit = {}
) - le paramètre de type pour
a
est explicitement donnée (à savoira[Nothing](Y)
) T
est covariant, pas contravariante (échoue également si elle est invariante)
Est-ce une cas particulier dans le compilateur pour Nothing
?
En tant, le semble après un travail autour de "intéressant" pour bien fonctionner:
trait X[-T]
object Y extends X[Nothing]
def a[T, U <: T](x: X[T]): X[U] = x
a(Y)
Merci pour la réponse, mais pourquoi utiliser 'String' au lieu de' Nothing' rend l'exemple compile? Ou pourquoi le work-around fonctionne-t-il? – adamw