[英]Scala: case classes and pattern matching
我在 Scala 中創建了這個案例類和函數:
abstract class Building[T]
case class University[T](a: Building[T], b: Building[T], c: T) extends Building
def u[A,B](a: Building[A]): Building[B] = a match {
case n: University[A] => University[B](n.a, n.b, n.c);
}
但是它在編譯時說:
[錯誤] test.scala:357: 類型不匹配; [錯誤] 發現:test.abc.def.University[B] [錯誤] 需要:test.abc.def.Building[B]
我究竟做錯了什么?
University
必須擴展Building[T]
而不僅僅是Building
case class University[T](a: Building[T], b: Building[T], c: T) extends Building[T]
這是完整的代碼
abstract class Building[T]
case class University[T](a: Building[T], b: Building[T], c: T) extends Building[T]
在u
函數中,輸出類型是Building[B]
。 你正在返回University[B]
但是University[B]
需要 a 是Building[B]
b 又是Building[B]
和c
是B
。
na
返回Building[A]
而不是Building[B]
因此University[B]
需要兩個Building[B]
和一個B
您不能通過na
、 nb
和nc
來創建university[B]
。
為了編譯代碼,我更改了輸出類型並返回University[B]
def u[A,B](a: Building[A]): Building[A] = a match {
case n: University[A] => University[A](n.a, n.b, n.c);
}
正確的代碼
abstract class Building[T]
case class University[T](a: Building[T], b: Building[T], c: T) extends Building[T]
def convert[A, B](a: A): B = ???
def bConvert[A, B](building: Building[A]): Building[B] = ???
def u[A,B](a: Building[A]): Building[B] = a match {
case n: University[A] => University[B](bConvert(n.a), bConvert(n.b), convert(n.c));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.