我已经使用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!!
在某种意义上可以将可为null的对象转换为不可为null的对象,从而向编译器保证您知道它永远不会为null(但您可能错了)。
...无法智能强制转换为“ReminderRequester”,...
此错误发生在return
语句上,并且如果您使用的是IntelliJ IDEA,则SReminderInstance
下有一个红色指示器。错误消息有点弱,但它意味着,因为您要将sReminderInstance
从返回类型为ReminderRequester
(不可为空的类型)的函数(get()
)转换,所以编译器需要将返回的变量强制转换为ReminderRequester
。但是,正如我所说的,sReminderInstance
不是ReminderRequester
(它是ReminderRequester
,即一个可为null的类型)。
您将在转换后的Java代码中经常看到这个错误。当您习惯于处理可能为null变量时,它们通常会被转换为可为null的类型。有时,在将其用作不可为nullable之前,只需检查其是否为null就会起作用。这就是所谓的“聪明演员”。其他时候,编译器认为线程可能会破坏智能强制转换,并不允许它(在这种情况下,当您确信线程不会成为问题时,可以使用!!
)。
总之,
上述错误的含义是什么?如何修复?
这意味着编译器尝试了“智能强制转换”。“智能强制转换”是试图将可为空的类型转换为不可为空的等价物的术语。并且智能强制转换并不总是允许的,即使您检查了变量是否为空。要进行修复,通常将!!
应用于要强制转换的变量。
我的困难是 如何修复函数SortByTotal中的任何错误? 1.1错误:(32,51)Kotlin:无法智能强制转换为“OrderProcessing.OrderNode”,因为“Run.Next”是一个复杂的表达式 我明白有很多错误,回答其中的任何一个部分或者给我一些暗示已经很感激了。谢谢你的好意。 我的代码如下: 涉及的类:
为了简化我的真实用例,让我们假设我想在一个列表中找到最大的数字: 但是,编译失败并出现以下错误: 智能强制转换为“Int”是不可能的,因为“max”是一个由变化的闭包捕获的局部变量 为什么更改的闭包会阻止智能强制转换在此示例中起作用?
我正在尝试在 Kotlin 中生成一个单例,并且遇到了问题,因为我无法。 这似乎是制作单例的一种非常标准的方法。为什么它不让我,我该如何解决它?
我知道是可变变量,但我显式检查了并且是类型,那么为什么不能智能转换为该类型呢? 我怎样才能把它修好呢?
我试了所有的办法,但都不起作用。应用程序一次又一次崩溃。拜托,救命。 这是用于Java和XML的应用程序代码。错误为 我的mainactivity.java代码如下所示 activity_main.xml的代码是
为什么当我使用No.2脚本时Android Studio显示错误。我发现1和2之间没有区别。 请解释这个案例