我正在实现自定义回收器 View 来响应具有某些参数的类的实例。为此,我实现了 VieHolders。我创建了一个抽象 ViewHolder,这样我就可以传递两个要膨胀的布局。但是,当我从父类(super class)继承并尝试在抽象类上实现构造函数时,它不会采用具体类所需要的参数,并且我收到一条错误消息,指出父类没有可用的默认构造函数。
我期望的工作:
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 无法将相同的参数传递给 super 构造函数作为具体类,否则我会得到“没有找到默认构造函数”,因此 CrimeHolder 的写法如下:
abstract class CrimeHolder extends RecyclerView.ViewHolder {
private CrimeHolder(View view){
super(view);
}
}
尽管我必须为 CrimeHolder 编写的构造函数只接受一个 View 参数,但我仍然必须将完整的参数传递给 RegularCrimeHolder 中的 super 构造函数。为什么子类调用带有这么多参数的 super 构造函数?
最佳答案
What I'm expecting to work
RecyclerView.ViewHolder
的构造函数 takes a single View
parameter 。您正在尝试传递三个参数。那不会编译。
And then the classes that extend from that would just do this
您的 CrimeViewHolder
构造函数采用三个参数。您的 RegularCrimeHolder
子类正在尝试传递单个参数。那不会编译。
Despite the fact that that the constructor I had to write for CrimeHolder only takes one View argument
不,super
调用需要一个参数。您声明的构造函数采用三个参数。
Why is the child class calling a super constructor with so many arguments?
据推测,您输入了该内容。看起来您尝试模仿 LayoutInflater
上的 inflate()
调用的参数列表。
将您的 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));
}
}
关于java - 为什么 super() 构造函数不采用与父构造函数相同的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56612928/