trait MyTrait { fun foo(t: T) : T } abstract class MyAbstractClass { abstract fun bar(t: T) : T } open class MyGenericClass : MyTrait, MyAbstractClass() { override fun foo(t: T) = t override fun bar(t: T) = t } class MyChildClass : MyGenericClass() {} class MyChildClass1 : MyGenericClass() {} class MyChildClass2 : MyGenericClass() { fun foo(t: T) = t override fun bar(t: T) = t } open class MyClass : MyTrait, MyAbstractClass() { override fun foo(i: Int) = i override fun bar(s: String) = s } class MyIllegalGenericClass1 : MyTrait, MyAbstractClass() {} class MyIllegalGenericClass2 : MyTrait, MyAbstractClass() { override fun foo(r: R) = r } class MyIllegalClass1 : MyTrait, MyAbstractClass() {} class MyIllegalClass2 : MyTrait, MyAbstractClass() { fun foo(t: T) = t fun bar(t: T) = t }