当前位置: 首页 > 知识库问答 >
问题:

在同伴对象中有companion.foo有什么区别?

况承福
2023-03-14

在Kotlin中,如果我在同伴对象中有一个以companion.作为前缀(companion.foo)的函数,那么与同伴对象中的foo相比会有什么不同呢?

我注意到,在下面的代码中,companion.foo将使它对外部作用域不可见,但对同一同伴对象内部的函数仍然可见。

您可以在:https://pl.kotl.in/T6FVM6NI6找到代码片段

fun main() {
    A.foo() // compiler complains "unresolved reference"
    A.bar()
    B.foo()
}

class A {
    companion object {
        fun Companion.foo() {
            println("hello in A")
        }

        fun bar() {
            foo()
        }
    }
}

class B {
    companion object {
        fun foo() {
            println("hello in B")
        }
    }
}

还有其他区别吗?a.companion.fooa.foo除了可见性之外是否相同?这是将方法封装在陪伴对象中的一种方法吗?

class C {
    companion object {
        inline fun <reified T> Companion.foo() {
            println("hello in A")
        }

        inline fun bar() {
            foo<String>()
        }
    }
}

共有1个答案

陶涵育
2023-03-14

在您的示例中,定义companion.foo()是作为成员的扩展。在本例中,您在与扩展的类型相同的类型a.companion中定义扩展。这是没用的。

下一个示例显示了扩展作为具有两个不同类的成员的概念。这个例子没有同伴,因为它对概念没有区别。

class A 

class B {
    fun A.foo() {
        println("Extension for A, only visible in B")
        println("Function has two 'this' references: ${this} and ${this@B}")
    }

    fun bar() {
        val a = A()
        a.foo() // this function call is only possible in the context of `B`
    }
}

fun main() {
    val a = A()
    a.foo() // compile error
}

尽管如此,示例中的两个foo()函数在内部具有不同的签名。普通函数foo()是在没有参数的陪伴对象上的一个简单方法。扩展函数companion.foo()是companion对象上的一个方法,但为第二个this引用添加了一个额外的参数。

class C {
    companion object {
        @PublishedApi
        internal inline fun <reified T> foo() {
            println("hello in A")
        }

        inline fun bar() {
            foo<String>()
        }
    }
}
 类似资料:
  • 可以省略陪伴对象的名称,在这种情况下,将使用名称: 但是,我看到的示例中没有使用同伴对象的名称。 因为每个类只能有一个同伴对象(否则会得到错误),所以这个名称对我来说就像是一些非常没用的语法糖。

  • Kotlin代码是这样的: 可以简单地更改为 我知道同伴对象可以用来作为真正的java静态函数使用,但是使用同伴对象还有其他的优点吗?

  • 本文向大家介绍json和对象有什么区别?相关面试题,主要包含被问及json和对象有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 JSON 是对象,但对象不一定是 JSON。 对象是由属性和属性值组成,也就是 KEY->VALUE 对。 对象中的 value 可以是任意的数据类型,包括函数。而 JSON 中的 value 不能为函数。

  • 问题内容: 谁能举例说明Javascript对象和JSON对象之间的区别? 问题答案: Javascript 对象 是Javascript 中的数据类型-仅在Javascript中才有意义。通常,您会看到这样的Javascript 对象文字 : JSON 字符串 是一种数据交换格式,它只不过是一串以特定方式格式化的字符(为了使不同的程序相互通信)。因此,它可以存在于Javascript或其他语言中

  • 本文向大家介绍window对象和document对象有什么区别?相关面试题,主要包含被问及window对象和document对象有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 document对象是window对象的一部分 document是用来操作dom元素的 window对象当你打开浏览器时就被创建,这个浏览器的所有东西都是window对象属性

  • 问题内容: 我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型。大多数时候,它在推断类型方面做得非常出色,但是在某些情况下,推断类型必须尽可能地通用:对象。但是Eclipse似乎给了我一个选择,可以选择对象类型还是“?”类型。 那么之间有什么区别: 和 问题答案: 匹配项的实例,但不是。假设你要编写一个接受到任何内容的映射的方法:如果你要编写 你无法提供。如果你写 有用! 在Jav