在此示例中,当 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)
}
首先,我检查了有关对象关键字定义的Kotlin文档:https://kotlinlang.org/docs/reference/object-declarations.html
有两件事,我们需要知道:
- 对象表达式:
open class Bar(val b: Int)
class Foo(val f: Int) {
val bar = object : Bar(f) {
}
}
它创建了一个从类型Bar
继承的匿名类的实例。并立即执行(并初始化)。
- 对象声明:
singleton模式,无法具有构造函数。
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)
}
刚刚声明匿名内部类,使用 companion对象 block,尽管它仍然无法参考外部变量。