Android 你认为呢?在if语句中,确保块内的实例不是';在所有if块中是否为空?

Android 你认为呢?在if语句中,确保块内的实例不是';在所有if块中是否为空?,android,kotlin,casting,Android,Kotlin,Casting,我知道如果我指定as?这样编译器就不会担心安全强制转换问题。 例如: w:Wolf? = Wolf() wolf = w as? Wolf if (item as? CountryDataItem != null) { // code that is using *item* } else{ } 现在我可以使用变量wolf调用wolf的任何公共成员,而无需使用问号(无需安全调用) 但是如果?位于未指定的if块和项变量内。例如: w:

我知道如果我指定as?这样编译器就不会担心安全强制转换问题。 例如:

w:Wolf? = Wolf()
wolf = w as? Wolf
  if (item as? CountryDataItem != null)
    {
           // code that is using *item*
    }

    else{
   } 
现在我可以使用变量wolf调用wolf的任何公共成员,而无需使用问号(无需安全调用)

但是如果?位于未指定的if块和项变量内。例如:

w:Wolf? = Wolf()
wolf = w as? Wolf
  if (item as? CountryDataItem != null)
    {
           // code that is using *item*
    }

    else{
   } 
if块中的代码是否可以将item用作CountryDataItem,而不需要强制转换,也不需要编译器在使用CountryDataItem时对安全调用进行注释
问题是因为这个项目不是保存在任何变量中,所以我不知道编译器是怎么考虑他的?

答案是肯定的。编译器知道,如果
item
为null,则控件将永远不会进入
if
块,因此
item
将智能转换为
CountryDataItem

然而,你所做的是不必要的。您应该改用
is
。像这样:

val myItem = item 
if (myItem is CountryDataItem) {
    // code that is using *myItem*
} else {
   ...
}
if(项目为CountryDataItem){
//使用*项的代码*
}
仅当字段
val
时,上述情况才成立。如果
item
var
,编译器将不会将其智能转换为
CountryDataItem
,因为它可能在其他地方更新。在这种情况下,您需要使用局部变量。像这样:

val myItem = item 
if (myItem is CountryDataItem) {
    // code that is using *myItem*
} else {
   ...
}

val myItem=项目为?CountryDataItem
如果(myItem!=null){
//使用*myItem的代码*
}否则{
...
}

答案是肯定的。编译器知道,如果
item
为null,则控件将永远不会进入
if
块,因此
item
将智能转换为
CountryDataItem

然而,你所做的是不必要的。您应该改用
is
。像这样:

val myItem = item 
if (myItem is CountryDataItem) {
    // code that is using *myItem*
} else {
   ...
}
if(项目为CountryDataItem){
//使用*项的代码*
}
仅当字段
val
时,上述情况才成立。如果
item
var
,编译器将不会将其智能转换为
CountryDataItem
,因为它可能在其他地方更新。在这种情况下,您需要使用局部变量。像这样:

val myItem = item 
if (myItem is CountryDataItem) {
    // code that is using *myItem*
} else {
   ...
}

val myItem=项目为?CountryDataItem
如果(myItem!=null){
//使用*myItem的代码*
}否则{
...
}

我可能错了,但我认为as的行为是什么?有点不同

当您执行
wolf=w as时?Wolf
Wolf
仍然是可为空的
Wolf?
,因此您仍然需要
Wolf?.method()

wolf=w,因为wolf
将使wolf成为不可为null的
wolf
,但是如果
w
为null,代码将抛出异常

这就是我从医生那里得到的


我可能错了,但我认为as的行为是什么?有点不同

当您执行
wolf=w as时?Wolf
Wolf
仍然是可为空的
Wolf?
,因此您仍然需要
Wolf?.method()

wolf=w,因为wolf
将使wolf成为不可为null的
wolf
,但是如果
w
为null,代码将抛出异常

这就是我从医生那里得到的


我理解有时会阻止我们按照您编写的方式进行操作,它会说他不能保证在不同的位置,项目在if检查和ifOhh块之间设置为null,因此您的字段
item
var
,可能会在应用程序的其他部分进行更新。我已经更新了我的答案我写代码的方式不合适吗?我是否必须将引用保存在局部变量中才能“享受”智能转换并确保该变量不等于null?尽管我没有将项的结果指定为?CountryDataItem如果块体中有CountryDataItem,它将被强制转换为CountryDataItem?我理解有时会阻止我们按照您编写的方式进行操作,它会说,他不能保证在不同的位置,项目在if检查和ifOhh块之间被设置为null,因此您的字段
项目
变量
,可能会在应用程序的其他部分进行更新。我已经更新了我的答案我写代码的方式不合适吗?我是否必须将引用保存在局部变量中才能“享受”智能转换并确保该变量不等于null?尽管我没有将项的结果指定为?CountryDataItem将在if块体内部强制转换为CountryDataItem?但在我的代码中,在块体之前,我已将该项检查为?CountryDataItem反对null,在使用himLuiz之前表示您的
wolf
示例-
w as?Wolf
的计算结果为非null
Wolf
类型或null,因此生成的类型是可为null的
Wolf?
(因为它可以是
Wolf
或null)。因此,您仍然必须使用
对其进行空检查,但在我的代码中,在块体之前,我已将该项检查为?CountryDataItem反对null,在使用himLuiz之前表示您的
wolf
示例-
w as?Wolf
的计算结果为非null
Wolf
类型或null,因此生成的类型是可为null的
Wolf?
(因为它可以是
Wolf
或null)。因此,您仍然必须使用