Kotlin - Functions in Java

WindSekirun (wind.seo)·2022년 4월 26일
0

이 글은 기존 운영했던 WordPress 블로그인 PyxisPub: Development Life (pyxispub.uzuki.live) 에서 가져온 글 입니다. 모든 글을 가져오지는 않으며, 작성 시점과 현재 시점에는 차이가 많이 존재합니다.

작성 시점: 2017-06-18

어느 날, 코틀린으로 구성된 유틸 클래스에 아래와 같은 메소드를 작성했다.

fun runDelayed(delayMillis: Long, action: () -> Unit) = Handler().postDelayed(Runnable(action), delayMillis)

이걸 코틀린 액티비티에서 사용할려고 할때, 어떻게 하면 될까.

간단하다.

runDelayed(delayMillis = 1000, action = {

})

그럼.. 자바에서는 어떻게 해야할까. 내키는대로 써보자.

Function0 라는 제너릭 클래스인 것 같다.

Utils.runDelayed(1000, new Function0<Unit>() {
            @Override
            public Unit invoke() {
                getLastestRelease();
                return null;
            }
 });

즉, 이렇게 된다. 안에 행동을 넣고 돌리면? 강제종료된다. 코틀린 코드에서 action 변수가 Nullable가 아닌데 null을 넘기니 NullPointerException가 발생하는 것이다.

해결방법은 Unit 클래스를 넘겨주면 된다.

Utils.runDelayed(1000, new Function0<Unit>() {
            @Override
            public Unit invoke() {
                getLastestRelease();
                return Unit.INSTANCE;
            }
});

참고로 유닛 클래스는 아래와 같다.

package kotlin

/**
 * The type with only one value: the Unit object. This type corresponds to the `void` type in Java.
 */
public object Unit {
    override fun toString() = "kotlin.Unit"
}

자바의 Void에 해당한다고 작성되어있다.

profile
Android Developer @kakaobank

0개의 댓글