为什么在定义对象时,我不能在类的内部引用构造函数参数

在这个例子中,当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

有两件事,我们需要知道:

  1. 对象表达式:

打开类Bar(val b:Int)

 class Foo(val f: Int) { val bar = object : Bar(f) { } } 

它创建了一个从类型Bar继承的匿名类的实例。 并立即执行(并初始化)。

  1. 对象声明:

单例模式,不能有构造函数。

 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) } 

它只是声明了一个匿名的内部类,而是使用了伴随对象块,尽管它仍然不能引用外部变量。