【问题标题】:Implement object by delegation in Kotlin在 Kotlin 中通过委托实现对象
【发布时间】:2020-08-10 08:20:36
【问题描述】:

可以通过委托实现类

class Envs(
  val map: Map<String, String> = to_map()
) : Map<String, String> by map

但它不适用于object,下面的代码不会编译

object Envs : Map<String, String> by map {
  val map: Map<String, String> = to_map()
}

【问题讨论】:

  • object 不应该带参数,它们的初始化更像是静态的(实际上不是静态的,而是像它一样)。你可以做更多像object Envs : Map&lt;String, String&gt; by to_map()
  • 报错信息与委托无关:“Constructors are not allowed for objects”
  • @Moira 我的错,我发布的代码略有错误,请查看更新后的问题。

标签: kotlin


【解决方案1】:

正如 cmets 中所解释的,object 不能接受参数,因为它们是静态初始化的(在 java 的静态块中)。

对于更新后的问题,不能指向未在主构造函数中声明的变量。类也是如此:

class Envs : Map<String, String> by map {
  val map: Map<String, String> = to_map()
}

^ 上面的代码不会编译,因为在你委托的时候不能访问 map 变量。它仅适用于其中声明的方法。

您可以随心所欲:

object Envs : Map<String, String> by to_map()

或者如果你想拥有地图的引用,虽然你不能,但由于对象是地图本身,你可以持有它的引用。

object Envs : Map<String, String> by to_map() {
    val map: Map<String, String> = this
}

但它(^)有点没用,你可以使用thisEnvs来访问地图。

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多