【问题标题】:What why doesn't the super() constructor take the same arguments as the parent constructor?为什么 super() 构造函数不采用与父构造函数相同的参数?
【发布时间】:2019-06-15 18:07:33
【问题描述】:

我正在实现自定义回收视图以响应具有某些参数的类的实例。为此,我实施了 VieHolders。我创建了一个抽象的 ViewHolder,这样我就可以通过两种布局来进行膨胀。但是,当我从超类继承并尝试在抽象类上实现构造函数时,它不会采用具体类的参数,并且我收到错误消息,指出父类没有可用的默认构造函数。

我期望的工作:

 private abstract class CrimeHolder extends RecyclerView.ViewHolder{
      public CrimeHolder(View view, ViewGroup parent, Boolean false){
           super(view, parent, false);
      }

然后从它扩展的类就会这样做:

 private class RegularCrimeHolder extends CrimeHolder{
      public RegularCrimeHolder(Inflater inflater, ViewGroup parent{
           super(inflater.inflate(R.layout.list_item_crime, parent, false));
      }
 }

但实际发生的情况是,CrimeHolder 不能将相同的参数作为具体类传递给超构造函数,或者我得到“没有找到默认构造函数”,因此 CrimeHolder 的编写方式如下:

abstract class CrimeHolder extends RecyclerView.ViewHolder {
    private CrimeHolder(View view){
        super(view);
    }


}

尽管我必须为 CrimeHolder 编写的构造函数只接受一个 View 参数,但我仍然必须将完整的参数传递给 RegularCrimeHolder 中的超级构造函数。为什么子类调用一个有这么多参数的超级构造函数?

【问题讨论】:

    标签: java android inheritance android-recyclerview constructor


    【解决方案1】:

    我期望的工作

    RecyclerView.ViewHoldertakes a single View parameter 的构造函数。您正在尝试传递三个参数。那不会编译。

    然后从它扩展的类就会这样做

    您的CrimeViewHolder 构造函数采用三个参数。您的 RegularCrimeHolder 子类正在尝试传递单个参数。那不会编译。

    尽管我必须为 CrimeHolder 编写的构造函数只接受一个 View 参数

    不,super 调用需要一个参数。您声明的构造函数接受三个参数。

    为什么子类调用一个有这么多参数的超级构造函数?

    大概是您输入的。看起来您尝试模仿inflate() 调用LayoutInflater 的参数列表。

    将您的CrimeHolder 改写为:

    private abstract class CrimeHolder extends RecyclerView.ViewHolder{
      public CrimeHolder(View view){
           super(view);
      }
    

    将您的RegularCrimeHolder 改写为:

    private class RegularCrimeHolder extends CrimeHolder{
          public RegularCrimeHolder(LayoutInflater inflater, ViewGroup parent) {
               super(inflater.inflate(R.layout.list_item_crime, parent, false));
          }
     }
    

    【讨论】:

    • 是的,这是我的错误。传递的是 inflate() 的返回值,所以它只是一个参数。
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2012-05-17
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2018-05-06
    • 2019-12-18
    • 2013-02-18
    相关资源
    最近更新 更多