具有公共方法的类子类类型

时间:2018-11-26 22:17:14

标签: kotlin

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

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;
    }

1 个答案:

答案 0 :(得分:2)

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

class MyClass(itemView: View) : RecyclerView.ViewHolder(itemView)

您的描述中缺少的是显示外部类:

class RecyclerView {                           // outer/containing class
    static class ViewHolder {                  // nested class
         public ViewHolder(ViewItem view) {    // constructor
              // ... constructor body
         }
    }
}

现在查看该嵌套,要谈论ViewHolder类,您需要将其引用为RecyclerView.ViewHolder。然后,如果要构造一个实例,则必须添加构造函数参数,例如在Java中:

new RecyclerView.ViewHolder(view);

在Kotin中,当您从某个类派生时,构造函数必须调用super构造函数,而这样做的捷径就是在声明中执行该操作。

class MyClass(ViewItem view) : RecyclerView.ViewHolder(view) {
    // ...class body
}

这表示MyClass源自ViewHolder,它是RecyclerView的嵌套类,并且进入MyClass构造函数的构造函数参数被传递到{{ 1}}。

这与Java相同:

ViewHolder

您还可以直接导入嵌套的静态类,然后删除class MyClass extends RecyclerView.ViewHolder { public MyClass(ViewItem view) { super(view); } } 前缀,但是保留它会更清楚。