在kotlin中获取实例错误:智能转换为“类型”是不可能的
我已经使用android studio内置文件转换器将java文件转换为kotlin。 它显示下面的错误。
[SMARTCAST_IMPOSSIBLE]智能转换为'ReminderRequester'是不可能的,因为'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 }
我检查了类似的问题,但我无法正确理解。
上述错误的含义是什么,如何解决?
你看到的错误是因为ReminderRequester
不一样ReminderRequester?
。 通过使用sReminderInstance!!
你在某种意义上把一个可空对象转换为一个不可为空的对象,保证编译器知道它永远不会为空(但你可能是错的)。
…聪明的投给'ReminderRequester'是不可能的,…
这个错误发生在return
语句上,如果你使用IntelliJ IDEA,在sReminderInstance
下有一个红色的指示器。 错误信息有点弱,但是这意味着因为你正在从具有ReminderRequester
(非空类型)返回类型的函数( get()
)转换sReminderInstance
,编译器需要将返回的变量转换为ReminderRequester
。 但是,正如我所说的, sReminderInstance
不是一个ReminderRequester
(它是一个ReminderRequester?
空类型)。
在转换的Java代码中,您会看到很多错误。 凡是用来处理可能为空的变量的地方,它们通常都会变成空的类型。 有时候,只是检查它是否为空之前使用它作为一个非空可以工作。 这就是所谓的“聪明的演员”。 其他时候,编译器认为线程可能会打败智能模型,并且不允许使用它(在这种情况下,如果确定线程不会成为问题,那么您可以使用!!
)。
综上所述,
上述错误的含义是什么,如何解决?
这意味着编译器尝试了一个“聪明的演员”。 “智能铸造”是试图将可空类型转换为不可空的等价物的术语。 即使您检查了变量是否为空,智能转换也不总是被允许的。 要解决,你通常会申请!!
到正在施放的变量。
2解决方案
1)强制返回类型与属性具有相同的类型
return sReminderInstance!!;
2)改变属性类型以匹配返回类型
val instance: ReminderRequester?