프로그래밍 언어/Kotlin
kotlin interface 익명 내부함수 lambda로 대체
65살까지 코딩
2023. 12. 4. 22:36
728x90
반응형
Kotlin fun interface와 interface 차이
먼저 fun interfcace를 사용하게된 계기...
interface LogCallStrategy<T> {
fun call() : T
}
다음과 같은 인터페이스가 있고
class LogHelperStrategy<T>(
private val logService: LogServiceDirtyCode,
private val logCallStrategy: LogCallStrategy<T>,
) {
fun execute(message: String): T {
var trace: Trace? = null
return runCatching {
trace = logService.begin(message)
logCallStrategy.call()
}.onSuccess {
logService.finish(trace!!)
}.onFailure {
logService.execption(trace!!)
throw it
}.getOrThrow()
}
}
위 인터페이스를 주입 받아서 사용하는 객체가 있다 (전략패턴)
나는 위 LogHelper를 사용할떄 다음과 같이 사용하고 싶었다.
@GetMapping
fun getItems(): List<Item> {
return LogHelperStrategy(logService) {
itemService.getItems()
}.execute("ItemControllerStrategy/getItems")
}
interface에 override를 할 fun이 하나이기 떄문에 Java에서 그래왔듯이 당연히 될거라고 착각했다.
fun getItems(): List<Item> {
return LogHelperStrategy(logService, object :LogCallStrategy<List<Item>>{
override fun call(): List<Item> {
return itemService.getItems()
}
}).execute("ItemControllerStrategy/getItems")
}
이렇게는 아주 잘되는데 왜 람다를 사용하면 받질 못하니...
Required:
LogCallStrategy<TypeVariable(T)>
Found:
() → List<Item> 계속 이런 error가 떳다..
찾아본 결과 kotiln에서 익명 내부함수를 람다로 사용하기 위해선 fun interface를 사용해야한다고 한다.
fun interface LogCallStrategy<T> {
fun call() : T
}
다음과 같이 수정하니 lambda로 잘 받아진다.
interface인데 함수가 하나이고 용도가 하나의 함수를 호출하는 용도이며 확장가능성이 없을때 funtional interface를 사용하자
728x90
반응형