如何在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 { } } } 

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

 class Sample { var click: ((Int)->Unit)? = null fun setOnClickListener(onClick : (Int)->Unit) { click = onClick } fun performClick() { click?.invoke(5) } } 

希望它可以帮助任何人