【问题标题】:Is it possible to add "static" extension function for Java class?是否可以为 Java 类添加“静态”扩展功能?
【发布时间】:2016-07-01 14:54:15
【问题描述】:

例如我有 Java 类(来自外部库):

class A {} // This is Java class

我想添加在 Kotlin 上编写的扩展函数,并将其命名为:

A.foo() // This is call of extension function `foo` from Kotlin code

据我了解,目前在 Kotlin 中是不可能的,因为它仅支持 KClass-es with companion object 的“静态”扩展功能。对吧?

似乎没有什么可以阻止以后在 Kotlin 中实现这样的功能。对吧?

2019-06-12 更新:这个question 没有回答我的问题,因为我的问题是关于 Kotlin 扩展函数与 Java 类的兼容性。

【问题讨论】:

  • 为什么需要这个?您可以在包中定义一个常规函数以获得相同的效果,除非您不必使用带点语法的类名来调用它。如果您希望使用反射来查找某个类中的静态方法,那就另当别论了……
  • 我只想使用A.foo() 语法而不是foo(A),因为Kotlin 提倡使用这种语法来扩展类的功能(参见第一段here)。
  • 对,扩展函数和属性是针对类的instances的。你这里没有实例,只是一个函数调用。
  • 但是,如果你想用foo(A)替换A.foo(),这意味着在foo(A)的情况下你需要一个A的实例,对吧?如果是这样,为什么不对实例使用扩展功能并做a.foo()
  • 我是说您根本没有在 A 类中定义函数。您只需在某个包中定义它,将其导入您想要使用它的代码中,然后在没有任何封闭类引用的情况下调用它。静态方法在其声明的参数之外根本不需要任何实例,对于包中定义的 kotlin 函数也是如此。

标签: kotlin


【解决方案1】:

你是对的。在 Kotlin 1.0 中,您可以在 Kotlin 类的伴随对象上定义扩展函数,并且可以使用 A.foo() 语法调用此类函数。支持在 Java 类上定义静态扩展函数是 Kotlin 未来版本的一个可能特性,但目前不在 Kotlin 1.1 的路线图中。

【讨论】:

  • 你好,有什么消息吗?
  • @elect 这仍然不在 1.1 或 1.2 的路线图上。
  • 这应该是!我们一直在 Swift 中使用它,并且它在很多场景中都很有用(例如:Date.fromJSON( ... ))。
  • 我同意,这会很棒。这是 YouTrack 的问题:youtrack.jetbrains.com/issue/KT-11968
  • 那么……答案是仍然不可能?
猜你喜欢
  • 2021-12-07
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 2010-12-05
相关资源
最近更新 更多