我有一个父类:
public class Partida {
private ArrayList<Jugador> jugadores;
private Tablero tablero;
private ArrayList<PartidaListener> observadores;
public Partida(Tablero tablero, ArrayList<Jugador> jugadores) {
observadores = new ArrayList<>();
this.tablero = tablero;
this.jugadores = jugadores;
}
由以下类继承:
public class PartidaC4 extends Partida {
private ArrayList<JugadorC4> jugadores;
private TableroC4 tablero;
private ArrayList<PartidaListenerC4> observadores;
public PartidaC4(TableroC4 tablero, ArrayList<JugadorC4> jugadores) {
observadores = new ArrayList<>();
this.tablero = tablero;
this.jugadores = jugadores;
}
写这篇文章时,我收到错误
错误:(39,73)错误:类Partida中的构造函数Partida无法应用于给定类型;
必需:Tablero,找到ArrayList:没有参数
原因:实际和正式的参数列表长度不同
我认为这是非常基本但我无法找到解决方案。我尝试使用Android Studio提供的两种解决方案(使用super()
),但我对此解决方案不满意,因为我需要使用与父类不同的对象类型。
我该怎么办?
答案 0 :(得分:2)
PartidaC4
类是Partida
的子类,因此在实例化PartidaC4
时,您需要指定应如何初始化其Partida
部分。由于你没有说任何关于这个Java的尝试使用没有参数的construtor初始化Partida
部分,但是在Partida
类中没有。所以错误。
我们真的不知道你需要什么,但看起来你想用这种方式初始化:
public Partida(Tablero tablero, ArrayList<Jugador> jugadores) {
super(tablero, jugadores): // initialize the "super" part with appropriate arguments.
observadores = new ArrayList<>();
this.tablero = tablero;
this.jugadores = jugadores;
}
如前所述,您应该知道定义中存在冗余:PartidaC4
中定义了tablero
,jugadores
和observadores
以及{{1}从超类继承的},tablero
和jugadores
。我怀疑这是你想要的......
答案 1 :(得分:1)
您可以为构造函数定义所需的任何参数,但是必须将超类的一个构造函数作为您自己的构造函数的第一行。这可以使用super()或super(arguments)来完成。
public class PartidaC4 extends Partida {
public PartidaC4() {
super(tablero,jugadores);
//do whatever you want to do in your constructor here
}
public PartidaC4(TableroC4 tablero, ArrayList<JugadorC4> jugadores) {
super(tablero, jugadores);
//do whatever you want to do in your constructor here
}
}
答案 2 :(得分:0)
您的基本Partida类需要一个无参数构造函数,或者您的PartidaC4类需要使用super()在其构造函数中调用它的构造函数。很可能你想要第二个,因为你还没有定义一个no args构造函数。
另外,你的代码闻起来有点味道。您不应该在基类和父类中构造相同的变量。其中一个应该是定义这些,而不是两者。