【问题标题】:What does it mean that KPropertyX interface which extends an expression like : () -> V扩展如下表达式的 KPropertyX 接口是什么意思: () -> V
【发布时间】:2021-02-19 08:53:41
【问题描述】:

我的问题在于我在 Kotlin 源代码中看到的一个示例。 这是 kotlin 中 Kproperty0 接口的声明:

public actual interface KProperty0<out V> : KProperty<V>, () -> V {

谁能解释一下我的用途是什么

() -> V

当我们扩展类或接口时,我们实际上继承了它的方法、属性等。我不明白我可以用什么来做

() -> V

【问题讨论】:

    标签: android kotlin lambda interface


    【解决方案1】:

    在这里做我自己的例子:

    class Foo : () -> String {
    
            override fun invoke(): String {
            return "Bar"
            }   
        }
    

    您可以这样做:

     val result = Foo().invoke()
    

    或者,正如 cmets 中所指出的,您可以通过直接 调用

    Foo()().
    

    所以,经过更多研究,我发现invoke 方法是一个运算符函数,在这种情况下,它也是 lambda 函数(或任何函数)的一部分,所以写一个等价的东西使用接口,你必须添加 operator 修饰符

    类似于以下内容:

       interface Bar {
        operator fun invoke(): String
    }
    
    class Foobar : Bar {
    
        override operator fun invoke(): String {
            return "foo"
        }
    }
    

    本质上,这只是定义调用此方法时会发生什么

    【讨论】:

    • 函数类型我懂,子类型怎么用我看不懂
    • 谢谢。所以如果我理解你,“()-> V”的意思是“说”该类实现了一个名为“invoke”的函数(如lambda表达式),它没有获取参数并返回类型V参数?
    • 我刚刚更新了我的答案以展示替代方法,但是是的,这只是一种简写方法,用于“强制”回调到实现此功能的类中
    • 函数有一个隐含的abstract operator fun invoke,您可以在子类型中覆盖它以提供函数的实现。但是使用类来实现函数的情况并不常见。您通常使用 lambda 或传递属性引用。
    • @Tenfour04 老实说,这只是我在示例中实施后对此的理解,如果我遗漏了什么,欢迎您写下您自己的答案,我会删除它,但从我的理解这只是一个简写,而不是必须声明接口?
    【解决方案2】:

    看起来它使用actual修饰符的特性,你必须为operator fun invoke()明确指定它。

    public actual interface KProperty<out V> : KCallable<V>
    
    public actual interface KProperty0<out V> : kotlin.reflect.KProperty<V>, () -> V {
       public actual fun get(): V
    
       public override abstract operator fun invoke(): V
    }
    
    public actual interface KProperty1<T, out V> : kotlin.reflect.KProperty<V>, (T) -> V {
       public actual fun get(receiver: T): V
    
       public override operator fun invoke(p1: T): V
    }
    

    【讨论】:

    • get 函数是否与解释相关? 实际修饰符功能是什么意思?
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多