| // 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" | |
| } |