2017-03-23 2 views
-1

rx 스트림 내에서 사용될 때 sealed classwhen 문에서 유형 안전성을 얻으려면 어떻게해야합니까? when 문장에 대한 봉인 된 클래스 유형 안전 - kotlin

:

private val handleDealOperation: (DealOperation) -> State.Change = { 
      operation -> 
      when (operation) { 
       //how to enforce type safety? `DealOperation` is a sealed class 
      } 
     } 

는 RX 스트림의 맥락에서 형태 보증하는 시도.

source.map(handleDealOperation) 

답변

0

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 
} 

누군가가이 문제에 대해 적절하게 버그를 신고하거나 행동을 설명 할 수 있다면 그렇게하십시오.

+1

신고 : [KT-17050] (https://youtrack.jetbrains.com/issue/KT-17050) – hotkey

관련 문제