理想情况下,我认为注释掉的if语句更有意义,至少对我而言。我的意思是,如果有人问我null是否大于0,那么我会回答否。或者如果null为真,那么也没有。但那些没有像我预期的那样工作,并抛出编译错误。所以,我改变了下面的那些。但那些看起来不好或简洁。有没有更好的方法来处理这些?
class Result(val code:Int)
{
}
fun getResult():Result?
{
return null;
}
fun main(args: Array<String>)
{
var result = getResult();
var success:Boolean? = null;
//if(result?.code > 0)
if(result?.code?:0 > 0)
{
print("Good.");
}
//if(success)
if(success == true)
{
print("Good.");
}
}
答案 0 :(得分:3)
>
被编译为compareTo(other: Int)
的调用,按惯例工作(在operator
上定义为Int
)。但是,您无法在可空Int?
上调用此函数。
有一种解决方法:在Int?
上创建另一个扩展程序:
operator fun Int?.compareTo(other: Int): Int =
(this ?: 0).compareTo(other)
现在你的电话确实有效:
if (result?.code > 0)
print("Good.")
答案 1 :(得分:1)
可空元素实际上是Result
实例本身,而不是其code
属性。
我认为将let
与安全获取运算符结合使用可以更准确地反映代码的设计:
result?.let {
if(it.code > 0) {
}
}
答案 2 :(得分:1)
注释掉的代码没有编译的原因是因为result?.code
可以为空并且你不能在可空表达式上调用比较运算符(即>
),因为它们不是类型匹配。 (它被定义为只接受不可为空的类型)
如果null大于0,那么我会回答否。或者如果null为真,那么也没有
Kotlin完全消除了可空和非可空实体之间的歧义。因此,在编译时,如果要与可空类型进行比较,kotlin编译器会拒绝编译,以提前避免运行时异常。在java中,
Integer x = null;
System.out.println(x > `)
这会编译但会在运行时抛出NullPointerException
,这显然是你不想要的。 Kotlin编译器在这里很聪明,通过拒绝编译来避免这种运行时异常。
现在更好地处理它,就像所有人说的那样,使用let
是一种合适的方法。一种更简单的方法可以是使用if expresion进行常规空值检查
if(result != null && result.code > 0) {
print("Good.");
}
答案 3 :(得分:0)
result?.code > 0
它无效,因为>
内部调用compareTo()
方法。 compareTo()
方法不适用于可空对象。这就是为什么您必须在变量code
上添加 elvis 运算符(?:)以在code
变量为compareTo()
变量时分配值空值。因此该值不为null,然后result?.code?:0 > 0
方法有效。
let
我添加了result
来解决。如果let
不为null,那么我们将在class Result(val code:Int){
}
fun getResult():Result?{
return null;
}
fun main(args: Array<String>){
var result = getResult();
var success:Boolean? = null;
//if(result?.code > 0)
if(result?.code?:0 > 0){
print("Good.");
}
// Updated Code
result?.let{
if(result.code > 0)
print("Good.")
}
//if(success)
if(success == true){
print("Good.");
}
}
块中执行代码。请检查更新的代码。
desc A.name;