birgersp
11/30/2017, 8:28 AMinterface Consumer<T> {
fun consume(item: T)
}
class SomeClass {
fun processInteger(integer: Int) {
println("I got ${integer}")
}
}
fun invokeConsumerFunction(consumer: Consumer<Int>) {
consumer.consume(123)
}
fun main(args: Array<String>) {
val obj = SomeClass()
// Attempts, neither of them compiles
invokeConsumerFunction(obj.processInteger)
invokeConsumerFunction({item -> obj.processInteger(item)})
}
birgersp
11/30/2017, 8:37 AMinvokeConsumerFunction(object: Consumer<Int> {
override fun consume(item: Int) {
obj.processInteger(item)
}
})
birgersp
11/30/2017, 8:38 AMinvokeConsumerFunction(obj::processInteger)
But it gives me the following error
Error:(22, 28) Kotlin: Type mismatch: inferred type is KFunction1<@ParameterName Int, Unit> but Consumer<Int> was expected
Pawel Urban
11/30/2017, 8:39 AMbirgersp
11/30/2017, 8:45 AMinterface Consumer<T> {
fun consume(item: T)
}
class SomeClass {
val intConsumer: Consumer<Int> = {integer -> processInteger(integer)}
fun processInteger(integer: Int) {
println("I got ${integer}")
}
}
fun invokeConsumerFunction(consumer: Consumer<Int>) {
consumer.consume(123)
}
fun main(args: Array<String>) {
val obj = SomeClass()
invokeConsumerFunction {obj.intConsumer}
}
birgersp
11/30/2017, 9:07 AMtypealias Consumer<T> = (T)->Unit
class SomeClass {
fun processInteger(integer: Int) {
println("I got ${integer}")
}
}
fun invokeConsumerFunction(consumer: Consumer<Int>) {
consumer(123)
}
fun main(args: Array<String>) {
val obj = SomeClass()
// this compiles just fine
invokeConsumerFunction(obj::processInteger)
invokeConsumerFunction({item -> obj.processInteger(item)})
}
Andreas Sinz
11/30/2017, 9:27 AMConsumer<T>
java or a kotlin interface?birgersp
11/30/2017, 9:49 AMAndreas Sinz
11/30/2017, 10:14 AMbirgersp
11/30/2017, 10:35 AMinterface Consumer<T> {
fun consume(item: T)
}
class SomeClass {
val intConsumer = Consumer<Int> {integer -> {processInteger(integer)}} // <-- doesnt compile, "Interface Consumer does not have constructors"
fun processInteger(integer: Int) {
println("I got ${integer}")
}
}
fun invokeConsumerFunction(consumer: Consumer<Int>) {
consumer.consume(123)
}
fun main(args: Array<String>) {
val obj = SomeClass()
invokeConsumerFunction(obj.intConsumer)
}
birgersp
11/30/2017, 10:35 AMAndreas Sinz
11/30/2017, 11:38 AMConsumer<T>
with Java, your code should actually workbirgersp
11/30/2017, 11:42 AMAndreas Sinz
11/30/2017, 11:50 AM(T) -> Unit
birgersp
11/30/2017, 11:56 AM