gpt4 book ai didi

kotlin - 扩展函数可以以 "static"的方式调用吗?

转载 作者:IT老高 更新时间:2023-10-28 13:47:05 33 4
gpt4 key购买 nike

是否可以创建一个扩展函数并调用它就好像它是静态的

例如...

fun System.sayByeAndExit() {
println("Goodbye!")
System.exit()
}

fun main(args: Array<String>) {
System.sayByeAndExit() // I'd like to be able to call this
}

我知道代码示例不起作用...

  • 我了解 kotlin 的扩展函数是静态解析的Kotlin Reference (Extension Functions) 中所述,但这并不意味着它们可以像类中的静态函数一样被调用(在 Java 意义上)。

  • 我也明白这段代码不会工作,因为没有没有System的实例可以传递给编译器生成的方法;因此它不会编译。

我为什么要这个?

有些人可能想知道为什么这种行为是可取的。我能理解为什么你会认为不是,所以这里有一些原因:

  1. 它具有标准扩展函数提供的所有好处。
  2. 不需要创建类的实例 只需即可访问额外的功能。
  3. 可以从应用程序范围的上下文(前提是类可见)访问这些函数。

总结一下……

Kotlin 有办法将静态函数“ Hook ”到类上吗?我很想知道。

最佳答案

您确实要求“类引用的扩展函数”或“向现有类添加静态方法”,此处的另一个问题已涵盖:How can one add static methods to Java classes in Kotlin由功能请求 KT-11968 覆盖

扩展函数不能添加到没有实例的任何东西上。对类的引用不是实例,因此您不能扩展诸如 java.lang.System 之类的内容。但是,您可以 extend a companion object现有类的。例如:

class LibraryThing {
companion object { /* ... */ }
}

允许您扩展 LibraryThing.Companion 并因此调用一些新的 myExtension() 方法看起来像是在扩展 Class 引用本身,而实际上您是在扩展伴生对象的单例实例:

fun LibraryThing.Companion.myExtension() = "foo"

LibraryThing.Companion.myExtension() // results in "foo"
LibraryThing.myExtension() // results in "foo"

因此,您可能会发现一些 Kotlin 库仅针对这种情况添加了空的伴随对象。其他人没有,而对于那些你“不走运”。由于 Java 没有伴生对象,因此您也不能对 Java 做同样的事情。

另一个通常要求的功能是采用现有的 Java 静态方法,该方法接受一个类的实例作为第一个参数,并使其表现为扩展函数。这由问题 KT-5261 跟踪, KT-2844 , KT-732 , KT-3487可能还有其他功能请求。

关于kotlin - 扩展函数可以以 "static"的方式调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39310128/

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