Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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
为什么java可空返回值可以分配给Kotlin不可空变量?_Java_Android_Kotlin - Fatal编程技术网

为什么java可空返回值可以分配给Kotlin不可空变量?

为什么java可空返回值可以分配给Kotlin不可空变量?,java,android,kotlin,Java,Android,Kotlin,我很惊讶编译了以下代码: lateinit var progressBar: ProgressBar 在onCreate中: progressBar = view.findViewById(R.id.pb_loader) findViewById声明它可以返回一个null,那么编译器如何不强制我声明: lateinit var progressBar: ProgressBar? 有人能帮我理解编译器何时强制执行,何时不强制执行吗?是一个Java函数。Kotlin编译器无法确定它是否可以返回

我很惊讶编译了以下代码:

lateinit var progressBar: ProgressBar
onCreate
中:

progressBar = view.findViewById(R.id.pb_loader)
findViewById
声明它可以返回一个
null
,那么编译器如何不强制我声明:

lateinit var progressBar: ProgressBar?
有人能帮我理解编译器何时强制执行,何时不强制执行吗?

是一个Java函数。Kotlin编译器无法确定它是否可以返回可为null的值,因为对于Java,只有可为null的类型存在(即使它们在运行时可能永远不会为null)

注释是为了文档(和互操作性)而引入的。可由Kotlin编译器用于确定正确的类型

但是,如果编译器无法确定类型是否被视为,这意味着作为开发人员,您必须在调用站点确定返回的值是否可能是
null

Java中的任何引用都可能是空的,这使得Kotlin严格的空安全要求对于来自Java的对象是不切实际的。Java声明的类型在Kotlin中特别处理,称为平台类型。对这类类型放宽了空检查,因此它们的安全保证与Java中的相同


所以是的,这是预期的行为。Kotlin不会检查来自JavaAPI的可空性,除非您添加了该方法
findViewById
很遗憾没有这样的注释。

谢谢,我理解。但是,当我使用java方法,并向不需要null参数的方法发送非null参数时,它是否也被编译?@DorVak必须用
@NotNull
(org.jetbrains.annotations.NotNull)注释java函数的参数,然后在Kotlin代码中得到编译时错误。当然还有其他注释,如我答案的进一步阅读链接中所述:),但您需要某种注释,因为在Java中没有其他方式来表示可空性。
findViewById
在框架的活动类中标记为
@Nullable
,但不在
androidx
子类AppCompatActivity中。因此,这种间接方式可能会导致Kotlin不将该方法视为带注释的方法。是的,它指的是方法返回类型。您刚刚看到Java的缺点泄漏到Kotlin中
findViewById
我敢肯定,在Kotlin出现之前,它已经为人们带来了许多NPE。我建议考虑使用视图绑定,创建视图绑定是为了完全避免此方法的问题。@DorVak可以确认它甚至不适用于
view.findViewById
。因为这里列出了这个注释:它可能是一个bug。