when
표현은 봉인 클래스에 대한 안전을 입력 준다, 그러나 변수에 람다를 저장이 특정한 경우에 그것으로 문제가 될 것 같습니다.
대신 함수를 사용하는 경우 예상대로, 모든 지점을 가지고 당신이 필요합니다 : 제대로 할 것을 요구, 자신의 람다를 사용하여
내 테스트에서
private fun handleDealOperation(operation: DealOperation): State.Change =
when (operation) {
// this will show a warning on `when`
}
이 잘 작동하는 것 같다 (의 가지로 철저하고 그들로부터 올바른 타입을 반환한다. (직접적으로 map
콜에 인자를 넣으려고한다.)하지만 실제로는 안되는 것처럼 보일지라도 변수에 저장하면 어떻게 든 컴파일된다.
이것은 sealed class
문제가 아니라 변수에 할당되었을 때 람다의 when
표현식과 관련된 문제입니다. 이 다음의 코드는, 예를 들어, 컴파일 및 실행시 충돌에 관계없이 when
의 인수가 무엇인지 :
val doSomething:() -> Int = {
when ("") { }
}
fun main(args: Array<String>) {
println(doSomething())
}
예외 존재 :
Exception in thread "main" java.lang.ClassCastException: kotlin.Unit cannot be cast to java.lang.Number
는 람다는 일반적으로 마지막을하지 않고 컴파일되지 것 식 Int
값을 반환하지만 when
문 반환 유형을 확인하는 데 문제가있는 것 같습니다. 그러나, 먼저 지역 변수에 할당 한 다음 당신에게 적절한 검사 및 오류를 준다 반환을 시도하고,이 컴파일되지 않습니다 : 그래서
val doSomething:() -> Int = {
val x = when("") {}
x
}
이 원래의 질문으로 되돌리려면, 당신은 할 수 지금 해킹으로 사용하십시오 :
private val handleDealOperation: (DealOperation) -> State.Change = {
operation ->
val temp = when (operation) {
}
temp
}
누군가가이 문제에 대해 적절하게 버그를 신고하거나 행동을 설명 할 수 있다면 그렇게하십시오.
신고 : [KT-17050] (https://youtrack.jetbrains.com/issue/KT-17050) – hotkey