гарантию ". Я опустил окончание первого слова, потому что все в этой публикации было слишком длинным. :)

la есть хорошая возможность выводить параметр типа внутри сопоставления с образцом. Он также проверяет исчерпанность сопоставления с образцом. Например:

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
}

Можно ли добиться того же, но используя члены типа вместо параметров типа?

sealed trait Field {
  type T
}

case object Field1 extends Field {
  type T = String
}

case object Field2 extends Field {
  type T = Int
}

Следующие решения не работают (протестировано в 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
}

Параметр типа действительно проблематичен в моем случае, потому что у меня много под-иерархий полей, и у каждой иерархии есть свои классы типов. Я не могу поместить все необходимые зависимости внутри объектов case, потому что они экспортируются в тонкий JAR для клиентов.

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

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