Android 你认为呢?在if语句中,确保块内的实例不是';在所有if块中是否为空?
我知道如果我指定as?这样编译器就不会担心安全强制转换问题。 例如: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:
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
的计算结果为非nullWolf
类型或null,因此生成的类型是可为null的Wolf?
(因为它可以是Wolf
或null)。因此,您仍然必须使用?
对其进行空检查,但在我的代码中,在块体之前,我已将该项检查为?CountryDataItem反对null,在使用himLuiz之前表示您的wolf
示例-w as?Wolf
的计算结果为非nullWolf
类型或null,因此生成的类型是可为null的Wolf?
(因为它可以是Wolf
或null)。因此,您仍然必须使用?