2015-07-13 2 views
1
sealed trait Foo { 
    type T <: Option[Any] 
    val x : T 
} 

case class Bar(x : Option[Int]) extends Foo { 
    type T = Option[Int] 
} 

val baz : Foo = Bar(Some(42)) 

baz.x match { 
    case Some(a) => a 
    case None => 1337 
} 

Ceci est le message d'erreur lors d'une tentative de correspondance de motif:Motif match Résumé type Trait Membre

:12: error: pattern type is incompatible with expected type; 
found : None.type 
required: baz.T 

Je crois que cela est dû au type d'effacement du type T.

+0

Ne devriez-vous pas faire le cas _ => 1337 à la place? – nattyddubbs

Répondre

0

Je suis pas sûr pourquoi cela échoue, probablement une limitation dans l'inférence de type. Les travaux suivants:

(baz.x: Option[Any]) match { 
    case Some(a) => a 
    case None => 1337 
} 

Dans tous les cas, demander un sous-type de Option n'a pas de sens. Mieux définir le type d'élément de l'option:

sealed trait Foo { 
    type A 
    def x: Option[A] 
} 

case class Bar(x : Option[Int]) extends Foo { 
    type A = Int 
} 

val baz : Foo = Bar(Some(42)) 

baz.x match { 
    case Some(a) => a 
    case None => 1337 
}