为什么super()构造函数不采用与父构造函数相同的参数?

时间:2019-06-15 18:07:33

标签: java android inheritance android-recyclerview constructor

我正在实现自定义recyclerviews以响应具有某些参数的类的实例。为此,我实现了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中的超构造函数。为什么子类调用具有这么多参数的超级构造函数?

1 个答案:

答案 0 :(得分:0)

  

我期望的工作

RecyclerView.ViewHolder takes 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));
      }
 }