在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.foo
和a.foo
除了可见性之外是否相同?这是将方法封装在陪伴对象中的一种方法吗?
class C {
companion object {
inline fun <reified T> Companion.foo() {
println("hello in A")
}
inline fun bar() {
foo<String>()
}
}
}
在您的示例中,定义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