如何在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中,我正在尝试…
科特林代码:
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) } }
有没有其他办法来实现这一目标?
编译器无法从var click = null
推断(Int) -> Unit
的types。
您可以将声明更改为类似于var click : (Int) -> Unit = {}
。 这明确指出types,并使用非空types,以免使performClick
复杂performClick
。
可以试试这个:
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 { } } }
我知道它已经回答了,但是如果你想坚持click
variables的null
声明,你可以这样写:
class Sample { var click: ((Int)->Unit)? = null fun setOnClickListener(onClick : (Int)->Unit) { click = onClick } fun performClick() { click?.invoke(5) } }
希望它可以帮助任何人