簡體   English   中英

Scala:案例類和模式匹配

[英]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]cB

na返回Building[A]而不是Building[B]因此University[B]需要兩個Building[B]和一個B 您不能通過nanbnc來創建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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM