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

时间:2016-12-02 01:39:34

标签: kotlin

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

1 个答案:

答案 0 :(得分:1)

首先,我检查了关于Object关键字定义的Kotlin文档: https://kotlinlang.org/docs/reference/object-declarations.html

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

  1. 对象表达式:
  2. open class Bar(val b:Int)

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

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

    1. 对象声明:
    2. 单例模式,不能有构造函数。

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

      刚刚声明了一个匿名内部类,使用 伴侣对象 阻止,但它仍然无法引用外部变量。