Pattern Match en objetos de caso con miembros de tipo

Scala tiene una buena característica para inferir el parámetro de tipo dentro de la coincidencia de patrón. También verifica la exhaustividad del patrón. Por ejemplo

sealed trait PField[T]

case object PField1 extends PField[String]

case object PField2 extends PField[Int]

def getValue[X](f: PField[X]): X = f match {
  case PField1 => "aaa"
  case PField2 => 123
}

Es posible lograr lo mismo pero utilizando miembros de tipo en lugar de parámetros de tipo?

sealed trait Field {
  type T
}

case object Field1 extends Field {
  type T = String
}

case object Field2 extends Field {
  type T = Int
}

as siguientes soluciones no funcionan (probado en Scala 2.12.6):

//No exhaustiveness check
def getValue[X](f: Field {type T = X}): X = f match {
  case Field1 => "aaa"
  //    case Field2 => 123
}

//casting needed
def getValue2[X](f: Field {type T = X}): X = (f: Field) match {
  case Field1 => "aaa".asInstanceOf[X]
  case Field2 => 123.asInstanceOf[X]
}

type Generified[X] = Field {type T = X}

//No exhaustiveness check
def getValue3[X](f: Generified[X]): X = f match {
  case Field1 => "aaa"
  //    case Field2 => 123
}

l parámetro @Type es realmente problemático en mi caso porque tengo muchas sub-jerarquías de Campos y cada jerarquía tiene algunas clases de tipos. No puedo poner todas las dependencias necesarias dentro de los objetos del caso porque se exportan en un JAR delgado a los clientes.

Respuestas a la pregunta(2)

Su respuesta a la pregunta