1

J'ai essayé de créer un alias de type lié au type dépendant _ >: a.type.Pourquoi le compilateur Scala interdit-il la déclaration d'un type générique comme super-type d'un paramètre de type

Le compilateur Scala signale une erreur que je ne comprenais pas:

scala> def foo[A](a: A) = { 
    | type F = Function1[_ >: a.type, Unit] 
    | } 
<console>:12: error: type mismatch; 
found : a.type (with underlying type A) 
required: AnyRef 
Note that A is unbounded, which means AnyRef is not a known parent. 
Such types can participate in value classes, but instances 
cannot appear in singleton types or in reference comparisons. 
     type F = Function1[_ >: a.type, Unit] 
           ^

Si je remplace a: A à a: A with AnyRef, cela fonctionne:

scala> def foo[A](a: A with AnyRef) = { 
    | type F = Function1[_ >: a.type, Unit] 
    | } 
foo: [A](a: A with AnyRef)Unit 

Pourquoi? Quel est le but de la restriction?

Répondre

5

Voir: http://docs.scala-lang.org/sips/pending/42.type.html

Tout vs AnyRef

Actuellement, il est possible d'utiliser des types singleton dans certains contextes, mais seulement sur les identifiants qui pointent à une constante qui est conforme à AnyRef. Cette restriction est due à N'ayant pas de méthode eq, ce qui est utilisé pour la vérification d'égalité de type singleton et la correspondance de modèle https://github.com/scala/scala/pull/3558. Cela a été discuté sur la liste de diffusion here et here, et il y a un consentement que cela doit être fait.

+0

Je ne comprends toujours pas pourquoi cela affecte _>: a.type. Je pensais à un type existentiel comme _>: a.type ne serait jamais impliqué dans le contrôle d'égalité de types. –

+0

Je suppose que le contexte n'est pas pris en compte lorsque la sauvegarde est appliquée; espérons que l'un des gourous de la langue Scala clarifiera. – devkat