interface Bar { fun something(input: T): R } class BarImpl1: Bar { override fun something(input :Unit): String { return "Test" } } class BarImpl2: Bar { override fun something(input :String): Int { return input.length } } class Foo() { val list = mutableListOf>() fun addElem(bar: Bar) { list.add(bar) } } fun main(args: Array) { val foo = Foo() foo.addElem(BarImpl1()) foo.addElem(BarImpl2()) val output1 = foo.list[0].something(Unit) val output2 = foo.list[1].something(output1) println(output2) }