委托给初始化属性时,"必须初始化变量"错误

Ale*_*nov 9 kotlin

object Foo : CharSequence by Foo.X {
    val X = ""
}
Run Code Online (Sandbox Code Playgroud)

产生

Variable 'X' must be initialized
Run Code Online (Sandbox Code Playgroud)

但它是!代码应转换为类似的东西

object Foo : CharSequence {
    val X = ""
    override val length get() = Foo.X.length
    override operator fun get(index: Int): Char = Foo.X[index]
    override fun subSequence(startIndex: Int, endIndex: Int) = Foo.X.subSequence(startIndex, endIndex)
}
Run Code Online (Sandbox Code Playgroud)

效果很好.

错误的原因是什么,是否有解决方法?在实际代码中,初始化是非常重要的,并且Foo需要是object(实际上是伴随对象),而不是a class.

Pau*_*cks 1

我推测在对象上使用类委托有点不明显,所以这可能就是原因的本质。

解决方法是直接委托给 String 的实例。这段代码对我有用:

fun main(args: Array<String>) {
    println("Hello, world! ${Bar.Foo.indexOf("z")}") // Prints "2"
}

class Bar {
  companion object Foo : CharSequence by String(StringBuilder("xyzzy")) {
  }
}
Run Code Online (Sandbox Code Playgroud)

旁白:StringKotlin 中没有采用 String 参数的构造函数。奇怪的是。

  • 关于最后一句话:相应的Java构造函数从版本7u6开始失去了它的主要用途(如果我没记错的话,但它应该是在这个范围内的东西)并且仍然存在以实现向后兼容性。Kotlin 不需要复制它。 (2认同)