Karlo
Karlo

Reputation: 189

How to convert lambda function in java to kotlin when there is one method in interface?

I want to set a listener in kotlin. Is there a way we can set it just similar to java lambda function (this::methodName)?

i tried converting it to kotlin automatically but it gives me error InterfaceListener does not have constructors

public class TestActivity {

    private Listener mListener;

    private void init(){
        setListener(this::onDataAdded);
    }

    private void onDataAdded(TestData testData) {

    }

    public void setListener(Listener listener) {
        this.mListener = listener;
    }

    interface Listener{
        void onDataAdded(TestData testData);
    }

    class TestData {
        String data;
    }

}

java to kotlin IDE converstion error message InterfaceListener does not have constructors

class TestActivity {

    private var mListener: Listener? = null

    private fun init() {
        setListener(Listener { this.onDataAdded(it) })
    }

    private fun onDataAdded(testData: TestData) {

    }

    fun setListener(listener: Listener) {
        this.mListener = listener
    }

    internal interface Listener {
        fun onDataAdded(testData: TestData)
    }

    internal inner class TestData {
        var data: String? = null
    }

}

Upvotes: 0

Views: 235

Answers (1)

Andrei Tanana
Andrei Tanana

Reputation: 8442

You can move your Listener interface to Java file so setListener(Listener { this.onDataAdded(it) }) will work.

Or you can use a function instead of the listener like this:

typealias Listener = (TestActivity.TestData) -> Unit

class TestActivity {
    private var mListener: Listener? = null

    private fun init() {
        setListener(this::onDataAdded)
    }

    private fun onDataAdded(testData: TestData) {

    }

    fun setListener(listener: Listener) {
        this.mListener = listener
    }

    inner class TestData {
        var data: String? = null
    }
}

Upvotes: 1

Related Questions