函数引用和lambdas

在尝试使用kotlin使用lambdas /函数引用时遇到了编译错误:

class Foo { fun getFilteredList(){ val numbers = listOf(1, 2, 3) numbers.filter(::isOdd) // prints [1, 3] } fun isOdd(x: Int): Boolean = x % 2 != 0 } 

但是我得到一个编译时错误说类型不匹配:

错误:(18,16)Gradle:类型推断失败:内联fun kotlin.Iterable.filter(谓词:(T) – > kotlin.Boolean):kotlin.List不能应用于接收者:kotlin.List参数:( kotlin。 (18,23)Gradle:类型不匹配:推断的类型是kotlin.reflect.KFunction2但(kotlin.Int) – > ??? (18,23)Gradle:类型不匹配:推断类型是kotlin.reflect.KFunction2,但是(kotlin.Int) – > kotlin.Boolean被预期错误:(18,25)Gradle:左边的a带有接收器参数的可调用引用不能为空。 请明确指定“::”前的接收器类型

我不知道错误是什么,也不知道我应该明确指定'::'

另一个问题:我可以在kotlin中使用另一个对象函数作为参考吗? 像这样的东西:

 class Bar { fun isOdd(x: Int): Boolean = x % 2 != 0 } class Foo { fun getFilteredList(){ val bar = Bar() val numbers = listOf(1, 2, 3) numbers.filter(bar::isOdd) // Use Bar's method } } 

在第二个例子中:是的,从Kotlin 1.1开始支持绑定的函数引用语法,所以你可以写类似于Java的bar::isOdd

在第一个例子中,错误试图说isOdd实际上是两个参数(类型FooInt )的函数,并且传递一个带有两个参数的函数作为参数,其类型是一个参数的函数是不允许的。 为了编译示例,可以使isOdd成为顶级函数或本地函数,这将使其成为Int类型的一个参数的函数。 或者,如果您使用Kotlin 1.1+,请使用绑定的函数引用语法,并简单地写入this::isOdd

那很好笑。 “Java反击” 哈哈

你的问题很简单:你在Foo类中声明了isOdd ,对吧? 那么这不是一个函数 ,而是一个方法 。 这意味着它需要一个Foo实例被传入( this引用) – 这就是为什么它是2个参数的函数: Foo.(Int) -> Boolean 。 语法错误显示 – 对一个方法的引用看起来像Foo::isOdd

无论如何,即使在Java中声明一个不使用该对象的非静态方法也是一个反模式,你不同意吗?

这个问题可以通过声明一个没有类的自由函数或者扩展它来解决: fun Int.isOdd()

PS关于你的第二个问题 – 该功能尚不支持。