// TARGET_BACKEND: JVM // FILE: Java1.java public class Java1 { public void foo(T t) { } public T bar() { return null; } } // FILE: Java2.java public interface Java2 { public void foo(T t); public T bar(); } // FILE: Java3.java public interface Java3 { public void foo(T t); public T bar(); } // FILE: 1.kt class A: Java1(), Java2 //Kotlin ← Java1, Java2 class B : Java1(), Java2 { override fun bar(): Int { return 1 } } class C: Java1(), Java2 where T: Number, T: Comparable class D: Java1(), Java2 where T: Number, T: Comparable { override fun foo(t: T) { } } class E : Java1(), Java3 class F : Java1(), Java3 { override fun bar(): Number { return 2 } } class G : Java1(), KotlinInterface // Kotlin ← Java, Kotlin2 class H: Java1(), KotlinInterface class I : Java1(), KotlinInterface { override fun bar(): Int { return 3 } } interface KotlinInterface{ fun foo(t: T) fun bar(): T? } fun test(a: A, b: B, c: C, d: D, e: E, f: F, g: G, h: H, i: I) { a.foo(null) a.foo(1) a.bar() b.foo(null) b.foo(1) b.bar() c.foo(null) c.foo(1) c.bar() d.foo(1.1F) d.bar() e.foo(1) e.bar() f.foo(2.2) f.bar() g.foo(2) g.bar() h.foo(null) h.bar() i.foo(null) i.bar() }