Конструктор неприменим (фактический и формальный списки аргументов различаются по длине), но он соответствует

Итак, я делаю задание для школы на java ... Это задание типа иерархии классов, и мы должны создать класс "Triangle.java", который расширяет класс "ClosedShape.java", который расширяет "Shape.java" ".... ClosedShape и Shape даны нам, так что, скорее всего, с ними все в порядке (я все равно опубликую их), но мой класс Triangle выглядит следующим образом:

    public abstract class Triangle extends ClosedShape{

        public Triangle(int[] a, int[] b, int base, int height){
            super(true, 3, a, b);
            setWidth(base);
            setHeight(height);
            setXYCoords(a, b);
        }

         public Triangle(int x, int y, int base, int height){
            int[] a = new int[3];
            int[] b = new int[3];

            a[0] = x;
            a[1] = (x+base)/2;
            a[2] = (x+base);

            b[0] = y;
            b[1] = (y+height)/2;
            b[2] = (y+height);
         }

}

Причина, по которой у меня есть два конструктора, заключается в том, что мне нужно создать эти два массива для хранения точек для рисования формы ... а затем мне нужно передать их в ClosedShape (boolean, int, int [], int []) суперкласс ... если я создаю массивы в том же конструкторе, они должны быть определены до вызова super (), чтобы их можно было передать, но это не разрешено, потому что вызов super () должен быть первым. . поэтому в настоящее время, когда я пытаюсь скомпилировать Triangle.java, я получаю сообщение об ошибке:

Triangle.java.14: error: no suitable constructor found for ClosedShape()
  { //little arrow pointing under the '{'

constructor ClosedShape.ClosedShape(boolean, int, int[], int[]) is not applicable
    (actual and formal argument lists differ in length)      
    constructor ClosedShape.ClosedShape(boolean, int) is not applicable
    (actual and formal argument lists differ in length)
1 error

Он также указывает в назначении, что сигнатура треугольника должна быть Traingle (int x, int y, int base, int height) ... Итак ... я запутался, потому что если я Я не ошибаюсь (что java считает, что я ...) Я сделал супер-вызов со всеми правильными значениями, и там есть конструктор ClosedShape (boolean, int, int [], int [ ]) "... вот класс ClosedShape:

    import java.awt.Graphics;

public abstract class ClosedShape extends Shape {
    boolean polygon;
    int numPoints;
    int[] xVertices;
    int[] yVertices;
    int x,y,width, height;

    public ClosedShape(boolean isPolygon, int numPoints) {
        super(0,0);
        this.polygon = isPolygon;
        this.numPoints = numPoints;
    }

    public ClosedShape(boolean isPolygon, int numPoints, int[] x, int[] y) {
        super(x[0],y[0]);
        this.polygon = isPolygon;
        if (isPolygon) {
            this.numPoints = numPoints;
            xVertices = new int[numPoints]; // error check?  if x.length == numPoints
            //for (int i = 0; i < x.length; i++) { // make copy of array: why?
            //  xVertices[i] = x[i];
            //}
            yVertices = new int[numPoints]; // error check?  if y.length == numPoints
            for (int i = 0; i < y.length; i++) { // make copy of array
                    yVertices[i] = y[i];
            }
        }
        else { // its an oval - define bounding box
            this.numPoints = 4;
            this.x = x[0];
            this.y = y[0];
            width = x[1];
            height = y[1];
        }
    }

    public void setXYCoords(int[] x, int[] y){
        this.xVertices = x;
        this.yVertices = y;
    }

    // Gives access to the width attribute
    public void setWidth(int width){
        this.width = width;
    }

    // Gives access to the height attribute
    public void setHeight(int height) {
        this.height = height;
    }

    public void draw(Graphics g) {
        if (polygon) {
            g.drawPolygon(xVertices, yVertices, numPoints);
        }
        else {
            g.drawOval(x, y, width, height);
        }

    }

    public abstract double Area();
    public abstract double Perimeter();








}

person MicroMumbler    schedule 01.03.2013    source источник
comment
Мой совет? Поверьте компилятору. Ваш код неверен.   -  person duffymo    schedule 01.03.2013
comment
Изменение второго конструктора на public void Triangle (...) делает его больше не конструктором. Теперь это становится обычным методом для Triangle. Таким образом, теперь он компилируется, потому что вы изменили свой проблемный конструктор, чтобы он не был конструктором.   -  person Marshmellow1328    schedule 01.03.2013
comment
Это безумный совет. Если вам нужен конструктор, напишите его правильно.   -  person duffymo    schedule 01.03.2013
comment
Мне нужен был конструктор, я его создал, но не осознавал, что, опуская void из второго метода, java распознает его как конструктор, а не как метод, как мне и нужно. Ошибка новичка. :) (Который я кстати ... огромный новичок ... лол)   -  person MicroMumbler    schedule 01.03.2013
comment
Я вернулся к своему исходному коду, я понимаю, что оба метода являются конструкторами, которых они не могут быть в этом случае ... так как еще я мог бы получить эти массивы в вызове super () ... ?   -  person MicroMumbler    schedule 01.03.2013
comment
Я понял, сделав то, что сделал ... это аннулирует спецификации создания конструктора (int x, int y, int base, int height) в формате ... хм ..   -  person MicroMumbler    schedule 01.03.2013


Ответы (3)


Проблема в том, что для ClosedShape нет конструктора по умолчанию без аргументов.

Посмотрите на этот ctor:

 public Triangle(int x, int y, int base, int height){

Явного вызова конструктора super() нет, поэтому компилятор предполагает, что ему нужно вызвать конструктор no-arg. Но нет ни одного ...

person duffymo    schedule 01.03.2013
comment
Лучше проверь себя, user93353. Проблема в другом, а не в том, на кого вы смотрите. - person duffymo; 01.03.2013
comment
Я понимаю, что я там сделал не так ... Я отредактировал его и внес свое единственное изменение, ха-ха, если я не ошибаюсь, теперь все должно быть хорошо ... Надеюсь, ха-ха-ха, он скомпилирован :) спасибо! - person MicroMumbler; 01.03.2013
comment
Так в чем же изменение? Написание конструктора без аргументов для ClosedShape или, что еще лучше, добавление правильного супервызова в Triangle? - person duffymo; 01.03.2013
comment
ну, я превратил второй метод в метод, а не ограничитель, изменив подпись на public void Triangle (...) - person MicroMumbler; 01.03.2013
comment
ну, я превратил второй метод в метод, который не является ограничителем, изменив подпись на public void Triangle (...) ... который, как я только что понял, аннулирует спецификации конструктор имеет формат (int x, int y, int base, int height) ... эээ - person MicroMumbler; 01.03.2013

Я наконец-то понял. Я вызываю конструктор, который мне даже не нужен! Мне нужно только вызвать первый конструктор, а затем использовать метод setXYCoords(), чтобы делать то, что мне нужно делать с массивами .... вот мой последний код:

(ClosedShape.java остался прежним)

import java.awt.Graphics;

public class Triangle extends ClosedShape{

    public Triangle(int x, int y, int base, int height){
        super(true, 3);

        setWidth(base);
        setHeight(height);

        int [] arrayX = new int[3];
        arrayX[0] = x;
        arrayX[1] = (x+(width/2));
        arrayX[2] = (x+width);

        int [] arrayY = new int[3];
        arrayY[0] = y;
        arrayY[1] = (y-height);
        arrayY[2] = y;

        setXYCoords(arrayX, arrayY);

    }

    public double Area(){
                return 0;
    }

    public double Perimeter(){
        return 0;
    }


}
person MicroMumbler    schedule 02.03.2013

Как заявил @duffymo, если вы явно не вызываете super(), компилятор вставит вызов конструктору no-arg.

Я думаю, что решение, которое вы ищете, - это заводской метод. Например, вы можете создать статический метод createTriangle(int x, int y, int base, int height). Создайте свои массивы в этом методе, вызовите соответствующий конструктор и затем верните созданный объект.

person Aurand    schedule 01.03.2013
comment
Ему не нужно использовать статический метод или фабрику. Ему нужно внимательнее присмотреться к классу ClosedShape. - person Marshmellow1328; 01.03.2013
comment
Я не думаю, что совет от Marshmellow1328 является лучшим в свете комментария выше. - person duffymo; 01.03.2013