// FILE: MyFunction.java public interface MyFunction { R foo(T x); } // FILE: JavaUsage.java public class JavaUsage { public static void foo1(MyFunction x) {} public static void foo2(MyFunction x) {} public static Y foo3(MyFunction f, X x) {} } // FILE: main.kt fun main() { JavaUsage.foo1 { x -> x.toInt().toString() } JavaUsage.foo2 { x -> x.toInt().toString() } JavaUsage.foo2 { x: Int -> x.toString() } JavaUsage.foo3( { x -> (x + 1).toString() }, 1 ) JavaUsage.foo3( { x: Number -> x.toInt().toString() }, 2 ) }