| // TARGET_BACKEND: JVM | |
| // ISSUE: KT-74999 | |
| // WITH_STDLIB | |
| // FILE: GraphQlTester.java | |
| public interface GraphQlTester { | |
| public static interface Traversable {} | |
| public static interface Entity<D, S extends Entity<D, S>> extends Traversable { | |
| <T extends S> T isEqualTo(Object expected); | |
| } | |
| public static interface Path extends Traversable { | |
| Path valueIsNull(); | |
| <E> GraphQlTester.Entity<E, ?> entity(Class<E> entityType); | |
| } | |
| } | |
| // FILE: test.kt | |
| inline fun <reified U> GraphQlTester.Path.isEqualTo(expected: U?) { | |
| if (null == expected) valueIsNull() | |
| // Type parameter T of isEqualTo is inferred to Nothing | |
| else entity(U::class.java).isEqualTo(expected) | |
| } | |
| open class EntityImpl<D> : GraphQlTester.Entity<D, EntityImpl<D>> { | |
| override fun <T : EntityImpl<D>> isEqualTo(expected: Any?): T = this as T | |
| } | |
| class PathImpl : GraphQlTester.Path { | |
| override fun valueIsNull() = this | |
| override fun <E> entity(entityType: Class<E>): GraphQlTester.Entity<E, *> = | |
| EntityImpl<E>() | |
| } | |
| fun box(): String { | |
| PathImpl().isEqualTo(42) | |
| return "OK" | |
| } |