为什么可以在泛型括号内添加问号而不是方法参数?
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
代码未被编译。
我不明白为什么在<>里面添加就可以了?
这是因为 onBindViewHolder
的 holder
参数类型在您扩展的 class 中被定义为非空。它在 Java 中定义,因此它使用注释来定义可空性:
public abstract void onBindViewHolder(@NonNull VH holder, int position);
所以 class 类型是不可空类型还是可空类型并不重要。方法参数定义为任何 class 类型的不可空版本。
对于 Adapter
class.
是否将类型定义为可空并不重要
如果 RecyclerView.Adapter
是在 Kotlin 中定义的,他们可能会将 class 类型标记为必须为非空,但这不能通过 Java 注释来完成.我认为这是对 Kotlin 中的方法参数可空性创建相同限制的唯一方法。
在 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
代码未被编译。
我不明白为什么在<>里面添加就可以了?
这是因为 onBindViewHolder
的 holder
参数类型在您扩展的 class 中被定义为非空。它在 Java 中定义,因此它使用注释来定义可空性:
public abstract void onBindViewHolder(@NonNull VH holder, int position);
所以 class 类型是不可空类型还是可空类型并不重要。方法参数定义为任何 class 类型的不可空版本。
对于 Adapter
class.
如果 RecyclerView.Adapter
是在 Kotlin 中定义的,他们可能会将 class 类型标记为必须为非空,但这不能通过 Java 注释来完成.我认为这是对 Kotlin 中的方法参数可空性创建相同限制的唯一方法。