【问题标题】:Class subclass type with a public method具有公共方法的类子类类型
【发布时间】:2018-11-27 12:48:21
【问题描述】:

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

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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

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

    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 中,当你从一个类下降时,你的构造函数必须调用超级构造函数,而简写方式是在声明中进行。

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

    这表示MyClassViewHolder 的后代RecyclerView 的嵌套类,并且进入MyClass 构造函数的构造函数参数被传递给ViewHolder 的超级构造函数。

    这和Java一样:

    class MyClass extends RecyclerView.ViewHolder {
        public MyClass(ViewItem view) {
            super(view);
        }
    }
    

    你也可以直接导入嵌套的静态类,然后去掉RecyclerView前缀,不过去掉就清楚一点了。

    【讨论】:

      猜你喜欢
      • 2014-01-03
      • 2022-01-01
      • 1970-01-01
      • 2020-09-11
      • 2022-11-18
      • 2018-10-29
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      相关资源
      最近更新 更多