Здравствуйте, Sinclair, Вы писали:
S>И у вас есть гарантия того, что если вы видите экземпляр общего типа, он является экземпляром одного из этих типов и ничем больше (поэтому у нас есть возможность выполнять exhaustiveness checking).
S>И вот тут и возникает некоторая проблема — как запретить порождать других наследников от Expression? В каком-нибудь дотнете это достигается package visibility для Expression.
А как package visibility позволит сделать exhaustiveness checking?
S>В ООП довольно сложно изобразить такую штуку,
Да вроде несложно... Вот на вскидку из популярных:
https://docs.oracle.com/en/java/javase/17/language/sealed-classes-and-interfaces.html
https://www.geeksforgeeks.org/scala/scala-sealed-trait/
https://kotlinlang.org/docs/sealed-classes.html
Но мне пока не довелось использовать на практике...