Android kotlin中的Get实例错误:智能转换为';类型';不可能
我已经使用android studio内置文件转换器将java文件转换为kotlin。它显示以下错误 [SMARTCAST_不可能]对“提醒请求者”进行智能转换是不可能的,因为 “ReminderRequester”是一个可能已更改的可变属性 这时 我的代码片段如下所示Android kotlin中的Get实例错误:智能转换为';类型';不可能,android,kotlin,Android,Kotlin,我已经使用android studio内置文件转换器将java文件转换为kotlin。它显示以下错误 [SMARTCAST_不可能]对“提醒请求者”进行智能转换是不可能的,因为 “ReminderRequester”是一个可能已更改的可变属性 这时 我的代码片段如下所示 private var sReminderInstance: ReminderRequester? = null val instance: ReminderRequester get() {
private var sReminderInstance: ReminderRequester? = null
val instance: ReminderRequester
get() {
if (sReminderInstance == null) {
sReminderInstance = ReminderRequester()
}
return sReminderInstance; // ERROR: Smart cast to 'ReminderRequester' is impossible, because 'ReminderRequester' is a mutable property that could have been changed by this time
}
我检查过类似类型的问题,但我无法正确理解
上述错误的含义是什么以及如何修复它?您看到的错误是因为
rementerrequester
与rementerrequester?
不同。通过使用sReminderInstance代码>从某种意义上讲,您正在将可为null的对象强制转换为不可为null的对象,从而向编译器保证您知道它永远不会为null(但您可能错了)
…智能转换为“提醒请求者”是不可能的
此错误发生在return
语句中,如果您使用的是IntelliJ IDEA,则sReminderInstance
下有一个红色指示灯。错误消息有点弱,但这意味着由于您正在从返回类型为rementerrequester
(不可为null的类型)的函数(get()
)中转换sReminderInstance
),编译器需要将返回的变量强制转换为rementerrequester
。但是,正如我所说,sReminderInstance
不是一个rementerrequester
(它是一个rementerrequester?
即一个可为空的类型)
您将在转换后的Java代码中经常看到此错误。如果您习惯于处理可能为null的变量,它们通常会转换为可为null的类型。有时,在将其用作非null值之前,只需检查它是否为null即可。这就是所谓的“聪明演员”。其他时候,编译器认为线程可能会破坏智能强制转换,并禁止它(在这种情况下,当您确定线程不会成为问题时,您可以使用!!
)
总之
上述错误的含义是什么?如何修复
这意味着编译器尝试了“智能强制转换”。“智能强制转换”是试图将可为null的类型转换为其不可为null的等效类型的术语。即使您检查了变量是否为null,也不总是允许智能强制转换。要修复,您通常会应用代码>到正在强制转换的变量。您看到的错误是因为rementerrequester
与rementerrequester?
不同。通过使用sReminderInstance代码>从某种意义上讲,您正在将可为null的对象强制转换为不可为null的对象,从而向编译器保证您知道它永远不会为null(但您可能错了)
…智能转换为“提醒请求者”是不可能的
此错误发生在return
语句中,如果您使用的是IntelliJ IDEA,则sReminderInstance
下有一个红色指示灯。错误消息有点弱,但这意味着由于您正在从返回类型为rementerrequester
(不可为null的类型)的函数(get()
)中转换sReminderInstance
),编译器需要将返回的变量强制转换为rementerrequester
。但是,正如我所说,sReminderInstance
不是一个rementerrequester
(它是一个rementerrequester?
即一个可为空的类型)
您将在转换后的Java代码中经常看到此错误。如果您习惯于处理可能为null的变量,它们通常会转换为可为null的类型。有时,在将其用作不可null之前,只需检查它是否为空即可。这就是所谓的“聪明演员”。其他时候,编译器认为线程可能会破坏智能强制转换,并禁止它(在这种情况下,当您确定线程不会成为问题时,您可以使用!!
)
总之
上述错误的含义是什么?如何修复
这意味着编译器尝试了“智能强制转换”。“智能强制转换”是试图将可为null的类型转换为其不可为null的等效类型的术语。即使您检查了变量是否为null,也不总是允许智能强制转换。要修复,您通常会应用编码>到正在转换的变量。2解决方案
1) 强制返回类型与属性具有相同的类型
return sReminderInstance!!;
2) 更改属性类型以匹配返回类型
val instance: ReminderRequester?
2解决方案
1) 强制返回类型与属性具有相同的类型
return sReminderInstance!!;
2) 更改属性类型以匹配返回类型
val instance: ReminderRequester?
关键字val表示变量是不可变的(不能更改)。将其更改为varusereturn sReminderInstance代码>@NSimon感谢您的评论。当我将其更改为var时,它在该行中将错误显示为“[MUST\u INITIALIZED]Property MUST-INITIALIZED”。@NSimon,您可以将可变属性公开为不可变。关键字val表示该变量不可变(无法更改)。将其更改为varusereturn sReminderInstance代码>@NSimon感谢您的评论。当我将其更改为var时,该行中的错误显示为“[MUST\u INITIALIZED]Property MUST-INITIALIZED”。@NSimon,您可以将可变属性公开为不可变的。谢谢您的回答和完美的解释。谢谢您的回答和完美的解释。@Semuel谢谢您的回答。@Semuel谢谢您的回答。@Semuel谢谢您的回答。