2017-12-02 32 views
0

私はHomeActivityに以下のコードを書いてLiveDataを使用しています。LiveDataオブザーバのKotlin構文?

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 

    // Show the launch splash screen. 
    // 
    this.setContentView(R.layout.activity_home) 

    this.viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java) 

    this.viewModel.getUser().observe(this, Observer { user: User? -> 

    }); 

} 

これは機能すると思われますが、次の部分はどういう意味ですか?

Observer { user: User? -> 

} 

これは

void onChanged (T t) 

https://developer.android.com/reference/android/arch/lifecycle/Observer.html

を有するObserverインターフェースに準拠したオブジェクトを生じなければならないどのようonChanged方法でオブジェクトに

Observer { user: User? -> 

} 

結果?

ラムダ式の前にインターフェイスの名前を入れるのはどういう意味なのでしょうか?

ありがとうございます!

答えて

2

これは、SAM変換、Javaのシングル抽象メソッドであなたの例のようにインタフェースを相互作用ができます概念と呼ばれています。

以下は、単一の抽象メソッドがrun()あるRunnableの実装を作成します。

val runnable = Runnable { println("This runs in a runnable") } 

ドキュメントに記載しています:https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

また、より多くの冗長、objectを使用することです:

val runnable2 = object : Runnable { 
     override fun run() { 
      println("This runs in a runnable") 
     } 
} 

どちらも匿名の実装例ですその接待はinterfaceです。もちろん、具体的なサブクラスを作成してインスタンス化することも可能です。

class MyRunnable : Runnable { 
    override fun run() { 
     println("This runs in a runnable") 
    } 
} 

val runnable3 = MyRunnable() 
+0

ありがとう、s1m0nw1。 onChangedメソッドを明示的に定義するより冗長な記述方法は何でしょうか? –

+0

あなたは、通常の方法ウィークラスMyObserverインタフェースを実装する場合:オブザーバー{//メソッドIMPL} – s1m0nw1

+0

にそれは 'this.viewModel.getUser()のように書くことができそうです(これは、オブジェクトを観察:オブザーバー { オーバーライドfun onChanged(ユーザー:User?){ } }); ' –

関連する問題