2016-12-02 130 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

    明白了,謝謝。 –