abstract class A { abstract fun foo(x: T) } class B : A() { override fun foo(x: Int) { println("B: $x") } } class C : A() { override fun foo(x: Any) { println("C: $x") } } fun foo(arg: A) { arg.foo(42) } fun main(args: Array) { foo(B()) foo(C()) }