hfhbd
06/04/2025, 5:03 PMis Foo.A, is Foo.B
public sealed interface Foo {
public val s: Int?
public data class A(override val s: Int): Foo
public data class B(override val s: Int): Foo
public data class C(override val s: Int?): Foo
}
public fun a(foo: Foo) {
when (foo){
is Foo.A -> foo.s + foo.s // smart cast to A and s is Int
is Foo.B -> foo.s + foo.s // smart cast to B and s is Int
is Foo.C -> (foo.s ?: 0) + (foo.s ?: 0) // smart cast to C, but s is Int?
}
when (foo){
is Foo.A, is Foo.B -> foo.s + foo.s // no smart cast, Foo.s is Int?
is Foo.C -> (foo.s ?: 0) + (foo.s ?: 0)
}
}
ephemient
06/04/2025, 5:08 PMephemient
06/04/2025, 5:09 PMsealed interface Foo2 {
override val s: Int
}
data class A(override val s: Int) : Foo2
data class B(override val s: Int) : Foo2
hfhbd
06/04/2025, 5:52 PMhfhbd
06/04/2025, 5:54 PMval s = if (true) "" else 42
. So it could also be inferred.ephemient
06/04/2025, 5:56 PMephemient
06/04/2025, 5:56 PM