为什么可以在泛型括号内添加问号而不是方法参数?

why it is fine to add question mark inside a generics brackets but not for method parameter?

在 Kotlin 中,我无法理解是否可以在重写 class 或方法时添加 ?。 例如下面的代码:

    class BaseAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>()
{
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        TODO("Not yet implemented")
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        TODO("Not yet implemented")
    }

    override fun getItemCount(): Int {
        TODO("Not yet implemented")
    }

}

如果我在<>里面加一个?,在RecyclerView.ViewHolder之后,代码就会被编译

但是,如果我在RecyclerView.ViewHolder后面加一个?? onBindViewHolder 函数,它说:

The Method Overrides nothing

代码未被编译。

我不明白为什么在<>里面添加就可以了?

这是因为 onBindViewHolderholder 参数类型在您扩展的 class 中被定义为非空。它在 Java 中定义,因此它使用注释来定义可空性:

public abstract void onBindViewHolder(@NonNull VH holder, int position);

所以 class 类型是不可空类型还是可空类型并不重要。方法参数定义为任何 class 类型的不可空版本。

对于 Adapter class.

是否将类型定义为可空并不重要

如果 RecyclerView.Adapter 是在 Kotlin 中定义的,他们可能会将 class 类型标记为必须为非空,但这不能通过 Java 注释来完成.我认为这是对 Kotlin 中的方法参数可空性创建相同限制的唯一方法。