Почему я не могу использовать элемент массива для вызова его метода? - PullRequest
0 голосов
/ 27 января 2019
public class Main {
    public static void main(String[] args) {
        Object[] array = new Object[1];
        Piece piece = new Piece();
        array[0] = piece;
        array[0].move();
    }
}

class Piece{
    public void move(){
        System.out.println("hello");
    }
}

Строка 6 не работает, и я не уверен, почему. Не должен массив [0] дать мне кусок и piece.move () вызвать метод в классе?

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Это потому, что в строке array[0] = piece; вы присваиваете Piece объект Object, который действителен, потому что Object является родительским классом для всех.

Но когда вы делаете array[0].move();, выпытается вызвать метод move() из ссылки на класс Object.Это невозможно, потому что метод move() не объявлен в классе Object.

Таким образом, вам необходимо выполнить приведение, как показано ниже:

((Piece)array[0]).move();

0 голосов
/ 27 января 2019

Когда вы сохраняете Piece как Object, компилятор больше не знает, что это Piece. Вы должны явно сказать это (приведите ((Piece)array[0]).move();).
В качестве альтернативы можно хранить объекты в Piece[] array.

Я предполагаю, что настоящей мотивацией является хранение разных типов предметов. В этом случае все они должны иметь одинаковый базовый тип. Это может быть достигнуто за счет того, что все типы элементов расширяют один и тот же базовый класс или реализуют общий интерфейс:

public class Main {
    public static void main(String[] args) {
        Movable[] array = new Movable[2];
        APiece aPiece = new APiece();
        BPiece bPiece = new BPiece();
        array[0] = aPiece;
        array[0].move();
        array[1] = bPiece;
        array[1].move();
    }
}

interface Movable {
    void move();
}

class APiece implements Movable{
    @Override
    public void move(){
        System.out.println("APiece moved ");
    }
}

class BPiece implements Movable{
    @Override
    public void move(){
        System.out.println("BPiece moved ");
    }
}
0 голосов
/ 27 января 2019

Когда вы добавляете его в массив объектов, вы используете функцию Piece как объект.

Попробуйте:

public class Main {
    public static void main(String[] args) {
        Piece[] array = new Piece[1];
        Piece piece = new Piece();
        array[0] = piece;
        array[0].move();
    }
}

class Piece{
    public void move(){
        System.out.println("hello");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...