【问题标题】:Can a Kotlin class be extended to conform to an Interface (like Swift classes can)?可以扩展 Kotlin 类以符合接口(如 Swift 类可以)吗?
【发布时间】:2018-12-14 06:19:33
【问题描述】:

在 Swift 中,我可以创建一个类似的协议

protocol FoobarConvertible {
    var foobar:String { get }
}

然后用符合规范的实现扩展系统中的任何类

extension String : FoobarConvertible {
    var foobar:String {
        get {
            return "foobar"
        }
    }
}

在 Kotlin 中,我认为接口类似于协议(?),我可以这样声明一个

protocol FoobarConvertible {
    val foobar:String
}

但是从文档(这似乎是一个简洁的练习)对我来说并不明显的是,我将如何扩展 Kotlin 的 String 类以使其符合 FoobarConvertible。显然,我可以在 Kotlin 字符串中添加一个扩展方法

val String.foobar:String
    get() = "foobar"

但这不允许将字符串用作参数,其中 FoobarConvertible 是预期的类型。

【问题讨论】:

标签: swift kotlin


【解决方案1】:

Kotlin 没有这种语言特性,扩展功能和扩展属性就扩展特性而言——这些都是可用的,因为它们可以通过静态辅助方法来实现,这些方法只需将扩展的接收者作为它们的第一个参数.

但是,不能将接口添加到您可能没有自己编译的现有类中——该功能不仅仅是语法糖。 (至少在 JVM 上。)

【讨论】:

  • 那么可能超出了这个问题的范围,但是......有没有解决这个问题的成语?
  • 并非如此。如果您需要能够在多个类的实例上调用相同的函数,则它们必须具有具有该函数的公共超类型。否则,您可以尝试为这些类中的每一个添加一个单独的扩展函数 - 也许它们都可以委托给一个通用实现。
猜你喜欢
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多