При использовании scala 2.12.8 это не скомпилируется без приведения:
trait Content
case object A extends Content
case class B(i: Int) extends Content
def asList[C <: Content](content: C): List[C] = content match {
case A => List(A) // compiles
case b: B => List(b) // does not compile
}
type mismatch;
found : b.type (with underlying type Playground.this.B)
required: C
Вот ссылка Scastie на проблему: https://scastie.scala-lang.org/JIziYOYNTwKoZpdCIPCvdQ
Почему работает для объекта case, а не для класса case? Как я могу заставить его работать для класса case?
РЕДАКТИРОВАТЬ
Первые ответы заставили меня понять, что я упростил свою проблему, вот обновленная версия:
sealed trait Content
case object A extends Content
final case class B(i: Int) extends Content
sealed trait Container[+C <: Content]
case class ContainerA(content: A.type) extends Container[A.type]
case class ContainerB(content: B) extends Container[B]
object Container {
def apply[C <: Content](content: C): Container[C] = content match {
case A => ContainerA(A) // compiles
case b: B => ContainerB(b) // does not compile
}
}
Ссылка на скасти: https://scastie.scala-lang.org/TDlJM5SYSwGl2gmQPvKEXQ
C не может быть подтипом B, поскольку B является окончательным.
List(b)
наList(content)
... но я не уверен, что этот метод делает то, что вы думаете... - person Lasf   schedule 04.02.2019