гарантию ". Я опустил окончание первого слова, потому что все в этой публикации было слишком длинным. :)
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 для клиентов.