Kann ich nicht eine generische Methode unapply
eines Extraktors zusammen mit einem impliziten "Konverter" verwenden, um eine Musterübereinstimmung zu unterstützen, die für den parametrisierten Typ spezifisch ist?Kann ein Scala "Extractor" Generics auf unapply verwenden?
Ich mag würde diese (Beachten Sie die Verwendung von [T]
auf der unapply
Linie) zu tun,
trait StringDecoder[A] {
def fromString(string: String): Option[A]
}
object ExampleExtractor {
def unapply[T](a: String)(implicit evidence: StringDecoder[T]): Option[T] = {
evidence.fromString(a)
}
}
object Example extends App {
implicit val stringDecoder = new StringDecoder[String] {
def fromString(string: String): Option[String] = Some(string)
}
implicit val intDecoder = new StringDecoder[Int] {
def fromString(string: String): Option[Int] = Some(string.charAt(0).toInt)
}
val result = "hello" match {
case ExampleExtractor[String](x) => x // <- type hint barfs
}
println(result)
}
aber ich erhalte den folgenden Kompilierungsfehler
Error: (25, 10) not found: type ExampleExtractor case ExampleExtractor[String] (x) => x ^
Es funktioniert gut, wenn ich nur einen impliziten val
im Geltungsbereich habe und den Typhinweis weglasse (siehe unten), aber das das Objekt vereitelt.
object Example extends App {
implicit val intDecoder = new StringDecoder[Int] {
def fromString(string: String): Option[Int] = Some(string.charAt(0).toInt)
}
val result = "hello" match {
case ExampleExtractor(x) => x
}
println(result)
}
Ich glaube nicht, dass dies im Moment möglich ist, siehe [SI-884] (https://issues.scala-lang.org/browse/SI-884). –