没有默认构造函数可用

时间:2018-04-02 17:33:37

标签: java android oop

我有一个父类:

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()),但我对此解决方案不满意,因为我需要使用与父类不同的对象类型。

我该怎么办?

3 个答案:

答案 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中定义了tablerojugadoresobservadores以及{{1}从超类继承的},tablerojugadores。我怀疑这是你想要的......

答案 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构造函数。

另外,你的代码闻起来有点味道。您不应该在基类和父类中构造相同的变量。其中一个应该是定义这些,而不是两者。