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]
занимает значение Building[B]
b, которое также является Building[B]
и c
, которое равно B
.
n.a
возвращает Building[A]
не Building[B]
так University[B]
занимает два Building[B]
и один B
. Вы не можете пройти n.a
, n.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));
}