class U interface T { fun foofoofoo(a: A, b: B, c: C): Int } abstract class T1 : T, U> { override fun foofoofoo(a: U, b: U, c: C): Int { throw UnsupportedOperationException() } } abstract class T2 : T1() { override fun foofoofoo(a: U, b: U, c: C): Int { throw UnsupportedOperationException() } } class T3 : T2() { override fun foofoofoo(a: U, b: U, c: D): Int { throw UnsupportedOperationException() } }