我已经使用android studio内置文件转换器将java文件转换为kotlin。它显示以下错误。
[SMARTCAST_IMPOSSIBLE]智能转换为'提醒请求者'是不可能的,因为 ' ReminderRequester'是一个可以改变的可变属性 到了这个时候
我的代码段如下所示。
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
}
我检查过类似的问题,但我无法正确理解。
上述错误的含义是什么以及如何解决?
答案 0 :(得分:2)
2个解决方案
1)强制返回类型与属性
具有相同的类型return sReminderInstance!!;
2)更改属性类型以匹配返回类型
val instance: ReminderRequester?
答案 1 :(得分:1)
您看到的错误是因为ReminderRequester
与ReminderRequester?
不同。通过使用sReminderInstance!!
,您在某种意义上可以将一个可空的对象转换为非可空对象,从而向编译器保证您知道它永远不会为空(但您可能错了)。
...聪明地投射到提醒请求者'是不可能的,......
return
语句中发生此错误,如果您使用的是IntelliJ IDEA,则sReminderInstance
下会显示一个红色指示符。错误消息有点弱,但这意味着因为您从函数(sReminderInstance
)转换get()
,其返回类型为ReminderRequester
(非可空类型),编译器需要将返回的变量强制转换为ReminderRequester
。但是,就像我说的那样,sReminderInstance
不是ReminderRequester
(它是ReminderRequester?
,即可以为空的类型。)
您将在转换后的Java代码中看到很多错误。无论您何时使用处理可能为null的变量,它们通常都会变为可空类型。有时,只是在将它用作非可空之前检查它是否为null将起作用。这被称为"智能演员"。其他时候,编译器认为线程可能会击败智能投射,并且不允许它(在这种情况下,当您确定线程不会成为问题时,您可以使用!!
。)
总之,
上述错误的含义是什么以及如何解决?
这意味着编译器尝试了#34;智能演员"。 "智能演员"是试图将可空类型转换为不可空的等价物的术语。即使您检查变量是否为空,也不会始终允许智能强制转换。要修复,通常会将!!
应用于正在投射的变量。