Тип Erasure в Scala
Я довольно смущен тем, что здесь происходит:
import scala.collection.immutable._
object Main extends App {
sealed trait Node
sealed trait Group
case class Sheet(
val splat: String,
val charname: String,
val children: ListMap[String, Node],
val params0: ListMap[String, Param], //params0 to separate sheet-general parameters
val note: Option[Note]
) extends Node with Group
case class Attributes(val name: String) extends Node with Group
case class Param(val name: String, val value: String) extends Node
case class Note(val note: String) extends Node
У меня есть три версии функции замены - последняя - это та, которую я на самом деле пытаюсь написать, остальные просто отлаживают.
class SheetUpdater(s: Sheet) {
def replace1[T <: Group](g: T): Unit = {
s.children.head match {
case (_, _:Sheet) =>
case (_, _:Attributes) =>
}
}
}
Эта версия не выдает никаких предупреждений, поэтому, очевидно, у меня есть доступ к типуs.children
во время выполнения.
class SheetUpdater(s: Sheet) {
def replace2[T <: Group](g: T): Unit = {
g match {
case _:Sheet =>
case _:Attributes =>
}
}
}
Так же как и эта версия, поэтому, очевидно, деталиg
Типтакже доступно во время выполнения ...
class SheetUpdater(s: Sheet) {
def replace3[T <: Group](g: T): Unit = {
s.children.head match {
case (_, _:T) => //!
case (_, _:Attributes) =>
}
}
}
... но даже в этом случае это приводит меня к ужасуAbstract type pattern T is unchecked since it is eliminated by erasure
предупреждение. Что тут происходит?