Java instanceof

У меня есть узел (узел Gridpane), и я хочу получить instanceof из класса, но ни для узла, ни для любого объекта я не могу получить instanceof своего класса, мне нужно добавить что-то в класс, чтобы сделать "instanceof", или я делаю это неправильно?

public void Move(GridPane gridPane) {
    for (Node node : gridPane.getChildren()) {
        if (GridPane.getColumnIndex(node) == this.x && GridPane.getRowIndex(node) == this.y - 2) {
            if (node instanceof blackPawn) {
                gridPane.setRowIndex(node, this.y);
                gridPane.setColumnIndex(node, this.x);
            }
            break;
        }
    }
}

Необратимые типы; не может привести "javafx.scene.Node" к "sample.Figures.blackPawn"

класс BlackPawn

package sample.Figures;

import javafx.event.EventHandler;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;

public class blackPawn {
public int x;
public int y;
public ImageView IMG = createChestImage();
private int j = 0;

public blackPawn(){}

public blackPawn(int x,int y)
{
    this.x = x;
    this.y = y;
}

private ImageView createChestImage() {
    final ImageView iv = new ImageView(new Image("sample/Sprites/blackPawn.png"));

    iv.setOnMouseEntered(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            iv.setImage(new Image("sample/Sprites/blackPawnStroke.png"));
            j = 0;
        }
    });

    iv.setOnMouseExited(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            if(j == 0)
            iv.setImage(new Image("sample/Sprites/blackPawn.png"));
        }
    });

    iv.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            iv.setImage(new Image("sample/Sprites/blackPawnStroke.png"));
            j = 1;
        }
    });

    return iv;
}

}

2 ответа

Решение

Вы пробуете приведение, которое никогда не будет возможно, и компилятор не позволит вам сделать это.

Например,

String s = "hello";
Integer i = (Integer) s;

не допускается, потому что String а также Integer не находятся в одной иерархии классов, поэтому такое приведение никогда не будет возможным. Компилятор позволит вам сделать это:

String s = "hello";
Object o = s;
Integer i = (Integer) o;

но это бросит ClassCastException во время выполнения.

В вашем случае вам, вероятно, нужно извлечь Figure от Node каким-то образом определить, есть ли черная пешка в этом узле, как в

if (getFigureForNode(node) instanceof BlackPawn) {
     ...

с методом

Figure getFigureForNode(Node n)

при условии, BlackPawn extends (или же implements) Figure,

Кодовый запах

Обратите внимание, что с помощью instanceof обычно не хороший дизайн. Вы, вероятно, хотите использовать метод isBlackPawn(Figure f) вместо этого, по линии return f.getFigureType() == FigureType.PAWN && f.getPlayerColor() == PlayerColor.WHITE,

Оператор java instanceof используется для проверки того, является ли объект экземпляром указанного типа (класс или подкласс)

http://www.java2s.com/Tutorial/Java/0060__Operators/TheinstanceofKeyword.htm

Другие вопросы по тегам