// TARGET_BACKEND: JVM // FILE: Base.java import org.jetbrains.annotations.NotNull; public interface Base { Base foo(@NotNull String name); } // FILE: Derived.java import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public interface Derived extends Base { @Override @NotNull Derived foo(@Nullable String name); } // FILE: Impl.kt abstract class Impl : Base { override fun foo(name: String): Base = this } // FILE: test.kt abstract class ImplDerived : Impl(), Derived { abstract override fun foo(name: String?): Derived } abstract class DerivedImpl : Derived, Impl() { abstract override fun foo(name: String?): Derived } fun box(): String { val x1: ImplDerived = object : ImplDerived() { override fun foo(name: String?): Derived = this } x1.foo("") (x1 as Base).foo("") (x1 as Derived).foo("") (x1 as Impl).foo("") val x2: DerivedImpl = object : DerivedImpl() { override fun foo(name: String?): Derived = this } x2.foo("") (x2 as Base).foo("") (x2 as Derived).foo("") (x2 as Impl).foo("") return "OK" }