코틀린

코틀린에서 sam인터페이스를 람다로 구현이 안될때

rkrkrr0101 2024. 7. 19. 23:24

기본적으로 자바처럼 sam인터페이스(메서드가 하나인 인터페이스)를 람다로 구현하려고하면 안됨

interface ExRateExtractor {
    fun extract(response: String): BigDecimal
}
override fun getExRate(currency: String): BigDecimal {
    val url = "https://open.er-api.com/v6/latest/$currency"
    return runApiForExRate(url, SimpleApiExecutor()) {
        val mapper = jacksonObjectMapper()
        val data = mapper.readValue(it, ExRateData::class.java)
        data.rates["KRW"] ?: throw IllegalArgumentException("KRW is null")
    }
}

타입이 일치하지않는다는 빨간줄이 나오고,인터페이스 대신 고차함수를 쓰라고 불평함

 

이때,자바에서 인터페이스를 만들고,그걸 코틀린에서 호출하면 또 됨

코틀린에서 인터페이스를 만들고 코틀린에서 호출하는경우만 안되는거

이걸 해결하려면

fun interface ExRateExtractor {
    fun extract(response: String): BigDecimal
}

인터페이스 앞에 fun을 붙여주면됨

 

 

보너스)

이렇게 sam을 람다로 구현할때,인텔리제이를 사용하고있으면 람다의 여는괄호 { 에 마우스를 올리면 it의 타입을 표시해줌

이때 정확히 괄호위에 올려야함