在此示例中,f
在声明bar
对象时未解析:
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)
}
答案 0 :(得分:1)
首先,我检查了关于Object关键字定义的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
的匿名类的实例。并立即执行(并初始化)。
单例模式,不能有构造函数。
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)
}
刚刚声明了一个匿名内部类,使用 伴侣对象 阻止,但它仍然无法引用外部变量。