我有一个这样的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
为空。
我本以为(this == null)
的计算结果为true,但是当infix函数命中TODO
时,我正在触发运行时异常。
这两个都是类的成员函数-因此,我怀疑“ this”是针对该类的实例( not null)而不是我以前的JsonNode?
期待。如何确保我引用的是JsonNode?
而不是类?
答案 0 :(得分:2)
NullNode
(jackson-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?
类型。