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