2017-12-07 7 views
1

lambdas kotlinを使用して同じ動作をエミュレートする方法。kotlinで同じ動作をエミュレートする方法

Javaコード:

var sample= Sample(); 

    sample.setOnClickListener({Int -> println("action performed") }) 
    sample.performClick(); //will call this method whenever needed. 


    class Sample { 

     var click=null; 

     fun setOnClickListener(onClick : (Int)->Unit){ 

      click= onClick // trying to assign and want to use it in another 
           funciton. I know it is wrong, how to achieve 
          this. 
     } 

     fun performClick() 
     { 
      click(5) 
     } 
    } 
:kotlin 1として

public interface OnClickListener{ 
    public void onClick(); 
    } 


    public class Sample { 

      OnclickListener mOnclickListener; 

      public void setOnclickListener(OnclickListener l){ 

       if(l!=null) 
       mOnclickListener =l; 
      } 


      public void performClick() 
      { 
       mOnclickListener.onClick(5); 
      } 

     } 

    public class SampleImpl{ 

    Sample sample=new Sample(); 
     sample.setOnClickListener(new OnClickListner(){ onClick{}}); 

    sample.performClick(); 

} 

は、機能はラムダで表すことができ、私は...

Kotlinコードをしようとしています一つの方法とのインタフェースのパラメータを受け取り、

これを達成するための選択肢はありますか?

+0

コトリンのセミコロンは任意です – Moira

+0

まず、あなたの'onClick()'がパラメータを受け取っていない場合、 'mOnclickListener.onClick(5);'で5を渡すのはなぜですか? –

答えて

4

コンパイラは(Int) -> Unitのタイプをvar click = nullから推論する方法がありません。

宣言をvar click : (Int) -> Unit = {}のように変更することができます。これは、型を明示的に述べて、performClickを複雑にしないようにnullを許可しない型を使用します。

0

Alterantivelyあなたはこれを試すことができます:

interface OnClickListener { 
     fun onClick() 
    } 


    inner class Sample { 

     internal var mOnclickListener: OnClickListener 

     fun setOnclickListener(l: OnClickListener?) { 

      if (l != null) 
       mOnclickListener = l 
     } 


     fun performClick() { 
      mOnclickListener.onClick(5) 
     } 

    } 

    inner class SampleImpl internal constructor() { 

     internal var sample = Sample() 

     init { 
      onClick 
      run { } 
     } 

    } 
0

を、私はそれが既に答えを知っていますが、click変数のnull宣言に固執する場合、あなたはそれが好きで書くことができます。

class Sample { 
    var click: ((Int)->Unit)? = null 

    fun setOnClickListener(onClick : (Int)->Unit) { 
     click = onClick 
    } 

    fun performClick() { 
     click?.invoke(5) 
    } 
} 

誰でも助けることができますように。

関連する問題