kotlin 如何在System类上创建扩展函数?

wnrlj8wa  于 2023-04-07  发布在  Kotlin
关注(0)|答案(3)|浏览(203)

我尝试在java.lang.System上创建一个扩展函数,将currentTimeMillis的用法重构为以下返回StringSystem.currentTimeinSeconds()扩展方法。(这样做是为了避免重复代码并在代码中重用它)
这是我尝试过的,但它不起作用:

fun System.currentTimeInSeconds () : String {
    return ((this.currentTimeMillis / 1000).toString())

任何指导,为什么这是不工作?谢谢。

nmpmafwu

nmpmafwu1#

你不能这样做。Kotlin目前只支持对象上的扩展函数,而不是类,System是一个类。

wwwo4jvm

wwwo4jvm2#

欢迎来到SO,首先,重申类和对象之间的区别很重要:

  • 类是创建对象的蓝图或模板。它定义了对象的属性和行为。
  • 另一方面,对象是类的示例,它是使用类提供的蓝图或模板创建的。

现在,你可以在这里找到大量关于Kotlin扩展函数的信息:

文件规定:
你可以为一个类或一个接口写一个你不能修改的第三方库的新函数。这样的函数可以用通常的方式调用,就好像它们是原始类的方法一样。这种机制被称为扩展函数。还有一些扩展属性,可以让你为现有的类定义新的属性。
如果你再往下看:
扩展函数内部的this关键字对应receiver对象(点之前传递的对象),现在可以在任何MutableList上调用这样的函数:
因此扩展函数作用于接收到的对象,而不是蓝图(类)本身。
System是一个类,而currentTimeMillis()是一个静态本地方法。因此,当你试图为它创建一个扩展函数时,你的扩展函数将在类本身上被调用,而不是在你的例子中的类的对象上,因为你沿着在从System调用静态方法。
接下来,你的需求真的需要一个扩展函数吗?你正在调用一个静态的,创建一个函数就足够了。(即你已经有了你需要的所有信息)

fun stringifedTimeInSeconds() =
    System.currentTimeMillis().div(1000).toString()

最后,可能值得阅读以下问题的一些答案:

希望这能帮上忙。

lf5gs5x2

lf5gs5x23#

顺便说一下,在官方的Kotlin Evolution and Enhancement Process(KEEP)中有一个关于这个的建议。
您可以在Kotlin statics and static extensions中查看详细信息。
但不幸的是,我们不会看到near特性的任何进展,因为该提案已从当前的路线图中删除。


https:kotlinlang.org/docs/roadmap.html#new-items

相关问题