Тип 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 предупреждение. Что тут происходит?

Ответы на вопрос(1)

Ваш ответ на вопрос