Как неоднократно обсуждалось на SO, соответствие Scala предупредит вас, если вы не исчерпывающе перечислите все типы, полученные из закрытого класса.
То, что я хочу, - это сгенерированный с помощью компиляции Iterable объектов case, происходящих от определенного родителя. В качестве альтернативы, я был бы доволен тем, как заставить компилятор сказать мне, что у меня нет всех необходимых типов в некоторых Iterable. Мне не нужен подход, основанный на анализе на основе времени выполнения.
В качестве примера второго подхода я хотел бы, чтобы следующий грубый код генерировал ошибку компиляции там, где это указано.
sealed trait Parent
case object A extends Parent
case object B extends Parent
case object C extends Parent
// I want a compiler error here because C is not included in the Seq()
val m = Seq(A, B).map(somethingUseful)
Не стесняйтесь отвечать, говоря мне, что это невозможно. Кажется, что это должно быть возможно на каком-то уровне, потому что компилятор должен выполнять практически ту же работу, когда определение соответствия не является исчерпывающим.
Размышляя об этом по-другому, я бы взял что-то вроде метода Enumeration.values (), кроме случаев, примененных к объектам case. Конечно, я мог бы добавить что-то похожее на приведенный выше код с сохраненным вручную списком значений в родительский объект-компаньон, но это кажется бесполезным для ошибок, когда компилятор может это сделать для меня.
// Manually maintained list of values
object Parent {
val values = Seq(A, B, C)
}