如何在可为null的中缀接收器上正确检查null?

时间:2019-01-30 15:32:57

标签: kotlin infix-notation

我有一个这样的Kotlin中缀函数:

private fun statementMeetsConditions(policy: PolicyStatement, per: PolicyEnforcementRequest): Boolean {
    return policy.conditions areMetBy per.attributes
}

private infix fun JsonNode?.areMetBy(attributes: Map<String, String>): Boolean {
    if (this == null) return true //no conditions, so we pass

    TODO("Condition-based policies not implemented")
}

在运行时,policy.conditions为空。

enter image description here

我本以为(this == null)的计算结果为true,但是当infix函数命中TODO时,我正在触发运行时异常。

这两个都是类的成员函数-因此,我怀疑“ this”是针对该类的实例( not null)而不是我以前的JsonNode?期待。如何确保我引用的是JsonNode?而不是类?

3 个答案:

答案 0 :(得分:2)

NullNodejackson-databind-javadoc)不是null ;-) NullNode实际上是它自己的类型...因此,您宁愿要检查该类型。 ..

检查this是否为null的{​​{1}}函数可以按您期望的方式进行,即使这些扩展函数包装在类中。

因此要检查您的infix是否包含该policy.conditions,您可以改为将条件更改为以下内容:

NullNode

答案 1 :(得分:0)

该空检查仍然是好的,在这种情况下,它检查可空的JsonNode?接收器是正确的。

但是,Kotlin中的TODO方法是一个爆炸性的任务,因为它在被击中时总是会抛出NotImplementedException。这就是为什么即使不是所有分支都从该方法返回Boolean值的情况下也允许编译此代码的原因。

答案 2 :(得分:0)

这实际上有点棘手。请注意条件值如何为"null"而不是null。这是因为

toString()

ValueNode调用asText()的{​​{1}},返回值{null”的NullNode,因此接收者String实际上是一直不为空。

因此,正如罗兰(Roland)所述,您必须检查接收器是否为JsonNode?类型。