在kotlin中获取实例错误:智能转换为'键入'是不可能的

时间:2017-10-31 11:33:39

标签: android kotlin

我已经使用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
        }

我检查过类似的问题,但我无法正确理解。

上述错误的含义是什么以及如何解决?

2 个答案:

答案 0 :(得分:2)

2个解决方案

1)强制返回类型与属性

具有相同的类型
return sReminderInstance!!;

2)更改属性类型以匹配返回类型

val instance: ReminderRequester?

答案 1 :(得分:1)

您看到的错误是因为ReminderRequesterReminderRequester?不同。通过使用sReminderInstance!!,您在某种意义上可以将一个可空的对象转换为非可空对象,从而向编译器保证您知道它永远不会为空(但您可能错了)。

  

...聪明地投射到提醒请求者'是不可能的,......

return语句中发生此错误,如果您使用的是IntelliJ IDEA,则sReminderInstance下会显示一个红色指示符。错误消息有点弱,但这意味着因为您从函数(sReminderInstance)转换get(),其返回类型为ReminderRequester(非可空类型),编译器需要将返回的变量强制转换为ReminderRequester。但是,就像我说的那样,sReminderInstance不是ReminderRequester(它是ReminderRequester?,即可以为空的类型。)

您将在转换后的Java代码中看到很多错误。无论您何时使用处理可能为null的变量,它们通常都会变为可空类型。有时,只是在将它用作非可空之前检查它是否为null将起作用。这被称为"智能演员"。其他时候,编译器认为线程可能会击败智能投射,并且不允许它(在这种情况下,当您确定线程不会成为问题时,您可以使用!!。)

总之,

  

上述错误的含义是什么以及如何解决?

这意味着编译器尝试了#34;智能演员"。 "智能演员"是试图将可空类型转换为不可空的等价物的术语。即使您检查变量是否为空,也不会始终允许智能强制转换。要修复,通常会将!!应用于正在投射的变量。