Kotlin合同对其他财产/功能的影响

时间:2019-03-18 18:55:51

标签: kotlin

Kotlin Contract是否有可能使这种智能广播成为可能?
假设我具有以下Maps扩展功能

fun<K, V> Maps<K, V>.contains(k : K) : Boolean
{
    //simply check for map containing key
}

在调用该方法之后,我希望将此调用强制转换为NotNull:

if(map.contains(key))
{
    map.get(key).callAnyMethod()
    //smartcast get(key) to not null
}

1 个答案:

答案 0 :(得分:0)

您目前无法使用合同执行此操作(请注意:如果他们涵盖此案,我会感到惊讶)。但是,标准库为您提供了两种不同的方式!

假设您有一个Map,则可以在其上调用containsKey(如果现在拥有,则进行排序)。知道在这种情况下“ A”不为空,我们可以使用.getValue("A")从映射中获取非空值。

val map = mapOf("A" to "B")
if(map.containsKey("A")) {
    println(map.getValue("A").toLowerCase())
}

请注意,如果您使用一个实际上为空的值调用.getValue(),则会得到一个NoSuchElementException

另一种惯用的方法是使用let,它只会在值不为null时执行该块:

map["A"]?.let { 
    println(it.toLowerCase())
}

在此示例中,如果您愿意,我们可以将["A"]替换为.get("A")