如何在kotlin中模仿相同的行为

时间:2017-12-07 05:56:38

标签: java kotlin

如何使用lambdas kotlin模拟相同的行为。

Java代码:

   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,函数接收单个方法的接口参数可以代表lambda,我正在尝试......

Kotlin代码:

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

有没有其他办法来实现这个目标?

3 个答案:

答案 0 :(得分:4)

编译器无法从(Int) -> Unit推断出var click = null的类型。

您可以将声明更改为var click : (Int) -> Unit = {}之类的内容。这明确说明了类型,并使用了不可为空的类型,以免使performClick复杂化。

答案 1 :(得分:0)

您可以尝试这样做:

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

    }

答案 2 :(得分:0)

我知道它已经回答了,但是如果你想坚持null click变量的声明,你可以这样写:

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

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

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

希望它可以帮助任何人