import java.util.Date fun assertGenericSuper(expected: String, function: Any?) { val clazz = (function as java.lang.Object).getClass()!! val genericSuper = clazz.getGenericInterfaces()[0]!! if ("$genericSuper" != expected) throw AssertionError("Fail, expected: $expected, actual: $genericSuper") } val unitFun = { } val intFun = { 42 } val stringParamFun = { x: String -> } val listFun = { l: List -> l } val mutableListFun = fun (l: MutableList): MutableList = null!! val funWithIn = fun (x: Comparable) {} val extensionFun = fun Any.() {} val extensionWithArgFun = fun Long.(x: Any): Date = Date() fun box(): String { assertGenericSuper("kotlin.jvm.functions.Function0", unitFun) assertGenericSuper("kotlin.jvm.functions.Function0", intFun) assertGenericSuper("kotlin.jvm.functions.Function1", stringParamFun) assertGenericSuper("kotlin.jvm.functions.Function1, java.util.List>", listFun) assertGenericSuper("kotlin.jvm.functions.Function1, java.util.List>", mutableListFun) assertGenericSuper("kotlin.jvm.functions.Function1, kotlin.Unit>", funWithIn) assertGenericSuper("kotlin.jvm.functions.Function1", extensionFun) assertGenericSuper("kotlin.jvm.functions.Function2", extensionWithArgFun) return "OK" }