Kotlin 使用公共方法初始化子类类型

Kotlin 使用公共方法初始化子类类型,kotlin,Kotlin,我不明白为什么在子类定义中涉及公共方法 class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) RecyclerView.ViewHolder的源代码 public abstract static class ViewHolder { public ViewHolder(View itemView) { if (itemView == null) { throw

我不明白为什么在子类定义中涉及公共方法

class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
RecyclerView.ViewHolder的源代码

public abstract static class ViewHolder {


    public ViewHolder(View itemView) {
        if (itemView == null) {
            throw new IllegalArgumentException("itemView may not be null");
        }
        this.itemView = itemView;
    }

您的问题是,为什么以下代码似乎在
RecylcerView
中调用公共方法
ViewHolder
。这是您的代码,稍加重命名以使事情更清楚:

class MyClass(itemView: View) : RecyclerView.ViewHolder(itemView)
您的描述中缺少的是显示外部类:

类回收视图{//外部/包含类
静态类ViewHolder{//嵌套类
公共视图持有者(视图项视图){//构造函数
//…构造体
}
}
}
现在来看这个嵌套,要讨论
ViewHolder
类,您需要将其引用为
RecyclerView.ViewHolder
。然后,如果要构造该实例,则必须添加构造函数参数,例如在Java中:

new RecyclerView.ViewHolder(视图);
在Kotin中,当您从一个类派生时,您的构造函数必须调用超级构造函数,其简写方式是在声明中调用超级构造函数

class MyClass(ViewItem view) : RecyclerView.ViewHolder(view) {
    // ...class body
}
这表示
MyClass
ViewHolder
派生而来,它是
RecyclerView
的嵌套类,进入
MyClass
构造函数的构造函数参数被传递到
ViewHolder
的超级构造函数中

这与Java相同:

class MyClass扩展了RecyclerView.ViewHolder{
公共MyClass(ViewItem视图){
超级(视图);
}
}

您也可以直接导入嵌套的静态类,然后删除
RecyclerView
前缀,但保留它会更清楚一些。

您的问题是为什么以下代码似乎在
RecylcerView
中调用公共方法
ViewHolder
。这是您的代码,稍加重命名以使事情更清楚:

class MyClass(itemView: View) : RecyclerView.ViewHolder(itemView)
您的描述中缺少的是显示外部类:

类回收视图{//外部/包含类
静态类ViewHolder{//嵌套类
公共视图持有者(视图项视图){//构造函数
//…构造体
}
}
}
现在来看这个嵌套,要讨论
ViewHolder
类,您需要将其引用为
RecyclerView.ViewHolder
。然后,如果要构造该实例,则必须添加构造函数参数,例如在Java中:

new RecyclerView.ViewHolder(视图);
在Kotin中,当您从一个类派生时,您的构造函数必须调用超级构造函数,其简写方式是在声明中调用超级构造函数

class MyClass(ViewItem view) : RecyclerView.ViewHolder(view) {
    // ...class body
}
这表示
MyClass
ViewHolder
派生而来,它是
RecyclerView
的嵌套类,进入
MyClass
构造函数的构造函数参数被传递到
ViewHolder
的超级构造函数中

这与Java相同:

class MyClass扩展了RecyclerView.ViewHolder{
公共MyClass(ViewItem视图){
超级(视图);
}
}
您也可以直接导入嵌套的静态类,然后删除
RecyclerView
前缀,但保留它会更清楚一些