2017-03-09 4 views
2

하자 내가지도 작업 할 때 정수코 틀린지도

val rank = mapOf("J" to 11, "Q" to 12, "K" to 13, "A" to 14) 

에 재생 카드의 편지를 번역을위한지도를 가지고 내가 항상 널 안전을해야 할 것 같다 말할 값 지도와 쌍이 불변 일지라도 확인하십시오 :

val difference = rank["Q"]!! - rank["K"]!! 

나는 이것이 일반적인 유형에서 오는 것 같습니까? 슈퍼 타입. Map과 Pair가 불변 일 때 컴파일 타임에 해결할 수없는 이유는 무엇입니까?

+0

청소기 코드에 대한 것이 바람직 할 수있다 '값'속성을 사용하여 열거 형. 다음은 간단한 구문 예입니다. http://pastebin.com/1BtynHMN –

답변

8

Map (Kotlin 또는 Java 기반)의 구현과 관련이 없습니다. 당신은지도를 사용하고 있으므로지도에 키가 없을 수 있습니다. 그러므로 [] 연산자는 nullable 유형을 반환합니다.

+0

Ofcourse! 지도에 key가 없으면 반환 값은 null입니다. –

2

mapOf()는 키의 존재에 대한 보장이없는 Map을 제공합니다. 이는 Map의 Java 구현을 고려할 때 특히 기대되는 종류입니다.

null-safe 호출 및 elvis 연산자를 사용하는 것이 개인적으로 선호 될 수 있지만 호출 사이트에서 더 깨끗한 코드를 선호하는 것처럼 들립니다 (특히 이러한 키가 존재하고 null이 아닌 값과 연결되어 있음을 알고 있다고 생각할 때). 다음을 고려하십시오 :

class NonNullMap<K, V>(private val map: Map<K, V>) : Map<K, V> by map { 
    override operator fun get(key: K): V { 
     return map[key]!! // Force an NPE if the key doesn't exist 
    } 
} 

map 구현에 위임하지만 get 메소드를 대체함으로써 리턴 값이 널이 아닌 것을 보장 할 수 있습니다. 이것은 당신이 더 이상 usecase에 대해 걱정할 필요가 없다는 것을 의미합니다 !!,?, 또는? :

일부 간단한 테스트 코드가이 사실로 보여줍니다

fun main(args: Array<String>) { 
    val rank = nonNullMapOf("J" to 11, "Q" to 12, "K" to 13, "A" to 14) 
    val jackValue: Int = rank["J"] // Works as expected 
    println(jackValue) 
    val paladinValue: Int = rank["P"] // Throws an NPE if it's not found, but chained calls are considered "safe" 
    println(jackValue) 
} 

// Provides the same interface for creating a NonNullMap as mapOf() does for Map 
fun <K, V> nonNullMapOf(vararg pairs: Pair<K, V>) = NonNullMap(mapOf<K, V>(*pairs)) 
관련 문제