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")