2016-12-02 75 views
0

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

首先,我查了一下对象关键字定义的科特林文件: https://kotlinlang.org/docs/reference/object-declarations.html

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

  1. 对象表达式:

公开课吧(VAL B:智力)

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

    刚刚宣布一个匿名内部类,使用同伴对象块代替,但仍不能REF以外的变量。

    +0

    因此,我定义对象的方式与定义伴随对象相同,并根据文档:“伴随对象在相应的类加载(解析)时初始化,匹配Java静态初始化器的语义”,对吧? –

    +1

    是的,我猜你需要的是伴侣对象。 – Jacob

    +0

    明白了,谢谢。 –