为什么在定义对象时,我不能在类的内部引用构造函数参数
在这个例子中,当bar
对象被声明时, f
是无法解析的:
open class Bar(val b: Int) class Foo(val f: Int) { object bar : Bar(f) // ^ // Unresolved reference: f }
但是当我将bar
声明为变量时,它工作得很好:
open class Bar(val b: Int) class Foo(val f: Int) { val bar = Bar(f) }
首先,我检查了关于Object关键字定义的Kotlin文档: https : //kotlinlang.org/docs/reference/object-declarations.html
有两件事,我们需要知道:
- 对象表达式:
打开类Bar(val b:Int)
class Foo(val f: Int) { val bar = object : Bar(f) { } }
它创建了一个从类型Bar
继承的匿名类的实例。 并立即执行(并初始化)。
- 对象声明:
单例模式,不能有构造函数。
open class Bar(val b: Int) object Foo { fun create(val f: Int) : Bar { return Bar(f) } }
或伴侣对象
open class Bar(val b: Int) object Foo { fun create(val f: Int) : Bar { return Bar(f) } }
好的,回到这个问题,我想你想要的是Java中类似的静态变量。 即使在Java中,也不能从静态字段中引用非静态字段对象。
而且不要用这种方式来使用对象:
class Foo(val f: Int) { object bar : Bar(f) }
它只是声明了一个匿名的内部类,而是使用了伴随对象块,尽管它仍然不能引用外部变量。