在可空的接收器上只允许安全(?。)或非空的断言(!!。)调用

时间:2017-10-27 15:13:44

标签: android kotlin

每次 InputStream inputOne = getClass().getResourceAsStream( "/Lab Exercise 3 Input/InputFile1.txt"); InputStream inputTwo = getClass().getResourceAsStream( "/Lab Exercise 3 Input/InputFile2.txt"); // create a scanner objects to read the files Scanner sc = new Scanner(inputOne); Scanner sc2 = new Scanner(inputTwo); ?.内都必须使用!!.onBindViewHolder吗?有什么方法可以避免这种情况吗?

onCreateViewHolderholder.textview.text显示此错误。

代码:

parent.context

3 个答案:

答案 0 :(得分:3)

当你覆盖用Java声明的方法时,它的参数将具有平台类型,这意味着没有关于它们的可空性信息(除非它们是explicitly annotated)。由您来决定是否将这些参数标记为可空。请参阅有关platform types的官方文档。

在您的情况下,您可以安全地从这两个参数中删除?,因为它们永远不会传递null值。这使您免于必须进行强制性空检查。

以下是移除可空类型的情况:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.textview.text = items[position]
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return ViewHolder(TextView(parent.context))
}

答案 1 :(得分:2)

在您的示例中使用可空类型时,必须对代码应用安全措施。您每次都使用?.,或者检查参数是否为!=null。在这样的if之后,编译器知道对此参数的调用是安全的,并且null是不可能的。

在您的特殊情况下,没有必要拥有可空类型。只需从参数中删除问号,一切都很好。

顺便说一下:不要使用!!,这肯定是一个更好的解决方案

答案 2 :(得分:1)

除非您在计数>中onCreateViewHolder中创建了空视图,否则视图永远不会为空。 0,所以可以安全地删除?

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.textview.text = items[position]
}