我怎么知道从 Kotlin 调用 java 方法时是否应该在调用站点检查可为 null 的参数?

How can i know when calling a java method from Kotlin if a nullable argument should be checked at call site?

作为一个需要从 java 过渡到 Kotlin 的初级程序员,我问了很多关于 Kotlin 和 Java 之间集成的问题。 我已阅读以下内容 link: Calling Java From Kotlin

但是我在调​​用java方法时似乎还是有困难。 例如,如果我的 Kotlin 代码中有一个 TextView

 val secondaryTextColor : Int? = weakReferenceContext.get()?.resources?.getColor(R.color.secondary_text_color)
 secondaryTextColor?.let {
     holder.someTextView.setTextColor(it)
 }

如果没有 let 块,上面的代码 将不会被编译 。如果我尝试在没有 let 的情况下进行编译,它将导致编译错误,提示 setTextColor expected an Int 但得到一个 Int? 我在看java源代码,有什么地方写着int参数不能为空。 因此,我必须知道可能是问题的唯一方法是通过编辑器或通过编译并获取 error。 我在问这是否是一种从 java 源代码中我将能够知道该方法是否接受可为 null 的参数的方法。 我希望我写 post 的方式清楚我在问什么,如果不是请告诉我,我会尽力详细说明,因为我 真的 需要理解一次永远

weakReferenceContext.get()?.resources?.getColor(R.color.secondary_text_color) 的 return 类型是什么?

它是一个 Int?(可以为 null 的 Int)。

所以 secondaryTextColor 有一个 Int? 类型,如果你想将它用作期望类型 Int 的函数中的参数(比如你的 someTextView.setTextColor)你必须想办法解决它。

为什么 TextView#setTextColor 需要一个非空参数?如果您查看文档,您可以看到它具有以下签名:

public void setTextColor(@ColorInt int color)

在签名中,int是Java中的原始类型。没有机会为 null。因此,Kotlin 将其解释为:

fun setTextColor(@ColorInt color: Int)

这里有不同的方法来解决可空性问题。一种方法是使用 let 块。请查看at the official docs on null safety以了解更多

附录: @ColorInt 是注释。 Int 表示颜色可以是对资源的引用 @ColorRes 或表示打包 ARGB 的颜色。请参阅文档 here