gpt4 book ai didi

java - 对功能 (SAM) 接口(interface)变量使用属性 getter 方法引用

转载 作者:行者123 更新时间:2023-12-05 03:17:04 26 4
gpt4 key购买 nike

我想将属性 getter 方法引用作为函数参数之一传递,并让该参数成为我自己的函数接口(interface)类型,但遇到了问题。

这是一个精简的最小可重现案例,我将变量从参数更改为属性,但问题是一样的。

class Foo {
val bar: Bar? = null
}

class Bar

fun interface FooBarSelector {
fun select(foo: Foo): Bar?
}

class KotlinClass() {
val selector: FooBarSelector = Foo::bar
}

这不编译,Foo::bar 有下划线,错误是

Type mismatch.
Required: FooBarSelector
Found: KProperty1<Foo, Bar?>

我试着查了一下,发现了关于 SAM 转换的类似问题,但它们有点不同,我认为它们中没有任何一个专门提到属性 getter。

我发现可以通过执行以下操作之一解决问题:

  1. 删除显式类型,或将其替换为建议的 KProperty1。没办法,我想保留我的风格。
  2. 将方法引用替换为 FooBarSelector { it.bar }。远非理想,但比第一种选择要好。

为什么会发生这种情况,还有其他选择吗?我是 Kotlin 的新手,但不是 Java。

使用的 Kotlin 版本是 1.7.20

编辑:

这是我最初的目标:接受一个 FooBarSelector 作为参数,默认情况下将它指向一个属性 getter:

fun doSomething(
selector: FooBarSelector = Foo::bar //doesn't compile
) {
}

最佳答案

你的 lambda 代码很好,但你可能更喜欢这种语法:

class KotlinClass() {
val selector = FooBarSelector(Foo::bar)
}

解释:

Kotlin 函数引用比 Java 中的类型更明确,因为函数引用是一流的对象类型。当你想将函数引用用作函数式接口(interface)实例时,你必须对其进行转换。这可以由编译器使用 SAM 转换自动完成。

SAM 转换仅在将函数引用作为参数传递给具有功能接口(interface)类型参数的函数时才有效。因此,它在分配给属性时不会直接起作用。

但 Kotlin 隐式地为函数式接口(interface)提供高阶函数,允许您传递一个函数引用,将其转换为接口(interface)实例。隐式函数以接口(interface)命名,因此看起来像构造函数调用。

在上面的代码中,隐式函数接口(interface)“constructor”是inline,所以编译后的代码中没有分配中间函数对象。这会编译成您在 Java 中通过直接方法引用获得的相同内容。

关于java - 对功能 (SAM) 接口(interface)变量使用属性 getter 方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74347358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com