在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?