Michał Tabor
Michał Tabor

Reputation: 2467

"Constructor cannot be applied to given types" when constructors have inheritance

This is my base class:

abstract public class CPU extends GameObject {
    protected float shiftX;
    protected float shiftY;

    public CPU(float x, float y) {
        super(x, y);
    }

and here is one of its subclasses:

public class Beam extends CPU {
    public Beam(float x, float y, float shiftX, float shiftY, int beamMode) {
        try {
            image = ImageIO.read(new File("/home/tab/Pictures/Beam"+beamMode+".gif"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.x = x;
        this.y = y;
        this.shiftX = shiftX;
        this.shiftY = shiftY;
    }

The New constructor is highlighted and it says:

Constructor CPU in class CPU cannot be applied to given types:
required: float, float
found: no arguments

How to solve it?

Upvotes: 9

Views: 29511

Answers (4)

Shivam Thacker
Shivam Thacker

Reputation: 79

If you don't specify any default constructor then at the compile time it will give you this error "constructor in class cannot be applied to given type;" Note: If you created any parameterized constructor.

Upvotes: 2

Miserable Variable
Miserable Variable

Reputation: 28752

The final object needs to in initialize the super class using one of its constructors. If there is a default (no-parameter) constructor then the compiler calls it implicitly, otherwise the subclass constructor needs to call it using super as the first line of its constructor.

In your case, that would be:

public Beam(float x, float y, float shiftX, float shiftY, int beamMode) { 
  super(x, y)

And remove the assignments to this.x and this.y later.

Also, avoid making them protected, makes it difficult to debug. Instead add getters and if absolutely necessary setters

Upvotes: 4

Peter Lawrey
Peter Lawrey

Reputation: 533502

I suspect you should write

protected float shiftX;
protected float shiftY;

public CPU(float x, float y, float shiftX, float shiftY) {
    super(x, y);
    this.shiftX = shiftX;
    this.shiftY = shiftY
}

and

public Beam(float x, float y, float shiftX, float shiftY, int beamMode) {
    super(x,y,shiftX,shiftY);
    try {
        image = ImageIO.read(new File("/home/tab/Pictures/Beam"+beamMode+".gif"));
    } catch (Exception e) {
        throw new AssertionError(e);
    }
}

Upvotes: 2

SLaks
SLaks

Reputation: 887415

As the error is trying to tell you, you need to pass parameters to your base class' constructor.

Add super(x, y);

Upvotes: 17

Related Questions