2016-10-16 4 views
2

ケースクラスとパターンマッチング:スカラ:私はScalaで、この場合のクラスや関数を作成しました

[エラー] test.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); 
} 

: 357: タイプの不一致。見つかった[エラー]:test.abc.def.University [B] [エラー]必要:test.abc.def.Building [B]

私が間違っているのか?

答えて

1

UniversityはここBuilding[T]だけでなくBuilding

case class University[T](a: Building[T], b: Building[T], c: T) extends Building[T] 

を拡張する必要がありますu機能出力タイプで、完全なコード

abstract class Building[T] 
case class University[T](a: Building[T], b: Building[T], c: T) extends Building[T] 

Building[B]です。あなたはUniversity[B]を返していますが、University[B]Building[B]bです。これもまたBuilding[B]cです。これはBです。

n.a戻るBuilding[A]ないBuilding[B]University[B]は、二つのBuilding[B]Bを取るように。 n.an.bおよびn.cには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)); 
} 
を変更したコードのコンパイルを作成するには
関連する問題