如何使用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)
}
}
有没有其他办法来实现这个目标?
答案 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)
}
}
希望它可以帮助任何人