当前位置: 首页 > 知识库问答 >
问题:

Kotlin中的获取实例错误:智能强制转换为“type”是不可能的[重复]

荀俊迈
2023-03-14

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

我查过类似的问题,但我不能正确地理解它。

上述错误的含义是什么?如何修复?

共有1个答案

邵羽
2023-03-14

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

...无法智能强制转换为“ReminderRequester”,...

此错误发生在return语句上,并且如果您使用的是IntelliJ IDEA,则SReminderInstance下有一个红色指示器。错误消息有点弱,但它意味着,因为您要将sReminderInstance从返回类型为ReminderRequester(不可为空的类型)的函数(get())转换,所以编译器需要将返回的变量强制转换为ReminderRequester。但是,正如我所说的,sReminderInstance不是ReminderRequester(它是ReminderRequester,即一个可为null的类型)。

您将在转换后的Java代码中经常看到这个错误。当您习惯于处理可能为null变量时,它们通常会被转换为可为null的类型。有时,在将其用作不可为nullable之前,只需检查其是否为null就会起作用。这就是所谓的“聪明演员”。其他时候,编译器认为线程可能会破坏智能强制转换,并不允许它(在这种情况下,当您确信线程不会成为问题时,可以使用!!)。

总之,

上述错误的含义是什么?如何修复?

这意味着编译器尝试了“智能强制转换”。“智能强制转换”是试图将可为空的类型转换为不可为空的等价物的术语。并且智能强制转换并不总是允许的,即使您检查了变量是否为空。要进行修复,通常将!!应用于要强制转换的变量。

 类似资料: