open class GenericBaseClass { open fun foo(x: T): T = x open fun ambiguous(x: T): T = x } interface GenericBaseInterface { fun bar(x: T): T = x fun ambiguous(x: T): T = x } class GenericDerivedClass : GenericBaseClass(), GenericBaseInterface { override fun foo(x: T): T = super.foo(x) override fun bar(x: T): T = super.bar(x) override fun ambiguous(x: T): T = foo(x) } class SpecializedDerivedClass : GenericBaseClass(), GenericBaseInterface { override fun foo(x: Int): Int = super.foo(x) override fun bar(x: String): String = super.bar(x) override fun ambiguous(x: String): String = bar(x) override fun ambiguous(x: Int): Int = foo(x) } class MixedDerivedClass : GenericBaseClass(), GenericBaseInterface { override fun foo(x: Int): Int = super.foo(x) override fun bar(x: T): T = super.bar(x) override fun ambiguous(x: Int): Int = foo(x) override fun ambiguous(x: T): T = bar(x) }