and for Kotlin/Scala you can use some cheeky operator overloading via companion objects.
sealed Interface A {
class B: A
class C: A
companion object {
operator fun invoke(s: String) = when (s) {
"B" -> B()
"C" -> C()
}
}
}
val a = A("B")