为什么在定义对象时我无法在类内部的构造函数参数中引用构造函数



在此示例中,当 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

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

  1. 对象表达式:
open class Bar(val b: Int)
    class Foo(val f: Int) {
        val bar = object : Bar(f) {
    }
}

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

  1. 对象声明:

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,尽管它仍然无法参考外部变量。

最新更新