package override.generics trait MyTrait { fun foo(t: T) : T } abstract class MyAbstractClass { abstract fun bar(t: T) : T abstract val pr : T } trait MyProps { val p : T } open class MyGenericClass(t : T) : MyTrait, MyAbstractClass(), MyProps { override fun foo(t: T) = t override fun bar(t: T) = t override val p : T = t override val pr : T = t } class MyChildClass() : MyGenericClass(1) {} class MyChildClass1(t : T) : MyGenericClass(t) {} class MyChildClass2(t : T) : MyGenericClass(t) { fun foo(t: T) = t val pr : T = t override fun bar(t: T) = t override val p : T = t } open class MyClass() : MyTrait, MyAbstractClass() { override fun foo(t: Int) = t override fun bar(t: String) = t override val pr : String = "1" } abstract class MyAbstractClass1 : MyTrait, MyAbstractClass() { override fun foo(t: Int) = t override fun bar(t: String) = t } class MyIllegalGenericClass1 : MyTrait, MyAbstractClass() {} class MyIllegalGenericClass2(r : R) : MyTrait, MyAbstractClass() { override fun foo(r: R) = r override val pr : R = r } class MyIllegalClass1 : MyTrait, MyAbstractClass() {} abstract class MyLegalAbstractClass1 : MyTrait, MyAbstractClass() {} class MyIllegalClass2(t : T) : MyTrait, MyAbstractClass() { fun foo(t: T) = t fun bar(t: T) = t val pr : T = t } abstract class MyLegalAbstractClass2(t : T) : MyTrait, MyAbstractClass() { fun foo(t: T) = t fun bar(t: T) = t val pr : T = t }