Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android kotlin中的Get实例错误:智能转换为';类型';不可能_Android_Kotlin - Fatal编程技术网

Android kotlin中的Get实例错误:智能转换为';类型';不可能

Android kotlin中的Get实例错误:智能转换为';类型';不可能,android,kotlin,Android,Kotlin,我已经使用android studio内置文件转换器将java文件转换为kotlin。它显示以下错误 [SMARTCAST_不可能]对“提醒请求者”进行智能转换是不可能的,因为 “ReminderRequester”是一个可能已更改的可变属性 这时 我的代码片段如下所示 private var sReminderInstance: ReminderRequester? = null val instance: ReminderRequester get() {

我已经使用android studio内置文件转换器将java文件转换为kotlin。它显示以下错误

[SMARTCAST_不可能]对“提醒请求者”进行智能转换是不可能的,因为 “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
        }
我检查过类似类型的问题,但我无法正确理解


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

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

…智能转换为“提醒请求者”是不可能的

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

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

总之

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


这意味着编译器尝试了“智能强制转换”。“智能强制转换”是试图将可为null的类型转换为其不可为null的等效类型的术语。即使您检查了变量是否为null,也不总是允许智能强制转换。要修复,您通常会应用
到正在强制转换的变量。

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

…智能转换为“提醒请求者”是不可能的

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

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

总之

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

这意味着编译器尝试了“智能强制转换”。“智能强制转换”是试图将可为null的类型转换为其不可为null的等效类型的术语。即使您检查了变量是否为null,也不总是允许智能强制转换。要修复,您通常会应用
到正在转换的变量。

2解决方案

1) 强制返回类型与属性具有相同的类型

return sReminderInstance!!;
2) 更改属性类型以匹配返回类型

val instance: ReminderRequester?
2解决方案

1) 强制返回类型与属性具有相同的类型

return sReminderInstance!!;
2) 更改属性类型以匹配返回类型

val instance: ReminderRequester?

关键字val表示变量是不可变的(不能更改)。将其更改为varuse
return sReminderInstance@NSimon感谢您的评论。当我将其更改为var时,它在该行中将错误显示为“[MUST\u INITIALIZED]Property MUST-INITIALIZED”。@NSimon,您可以将可变属性公开为不可变。关键字val表示该变量不可变(无法更改)。将其更改为varuse
return sReminderInstance@NSimon感谢您的评论。当我将其更改为var时,该行中的错误显示为“[MUST\u INITIALIZED]Property MUST-INITIALIZED”。@NSimon,您可以将可变属性公开为不可变的。谢谢您的回答和完美的解释。谢谢您的回答和完美的解释。@Semuel谢谢您的回答。@Semuel谢谢您的回答。@Semuel谢谢您的回答。