2017-12-07 1 views
1

Wie emulieren Sie das gleiche Verhalten mit Lambdas Kotlin.Wie emulieren Sie das gleiche Verhalten in Kotlin

Java-Code:

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(); 

} 

Per Kotlin empfängt Funktionsparameter der Schnittstelle mit einzelnen Verfahren in Lambda darstellen kann, ich versuche ...

Kotlin Code:

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

Gibt es eine Alternative, um dies zu erreichen?

+0

Semikolons in Kotlin sind optional – Moira

+0

Zunächst einmal Ihre Der Code sollte syntaxmäßig korrekt sein, so als würde 'onClick() 'keinen Parameter erhalten. Warum übergeben Sie 5 an' mOnclickListener.onClick (5); '? –

Antwort

4

Der Compiler hat keine Möglichkeit, einen Typ von (Int) -> Unit von var click = null abzuleiten.

Sie können die Deklaration in etwas wie var click : (Int) -> Unit = {} ändern. Dies gibt explizit den Typ an und verwendet einen nicht nullfähigen Typ, um performClick nicht zu komplizieren.

0

Alterantively Sie können dies versuchen:

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

Ich weiß es schon beantwortet, aber wenn Sie mit null Erklärung click variabel halten möchten, können Sie schreiben Sie es mögen:

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

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

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

Hoffe, es kann jedem helfen

Verwandte Themen