【问题标题】:Java instanceofJava 实例
【发布时间】:2018-05-14 12:35:14
【问题描述】:

我有一个节点(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;
}

}

【问题讨论】:

标签: java instanceof


【解决方案1】:

你正在尝试一个永远不可能的强制转换,编译器不会让你这样做。

例如,

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

是不允许的,因为 StringInteger 不在同一个类层次结构中,所以这种转换永远不可能。编译器会让你这样做:

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

但这会在运行时抛出ClassCastException

在您的情况下,您可能需要以某种方式从Node 中提取Figure,以确定该节点是否有黑棋,如

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

有方法

Figure getFigureForNode(Node n)

假设BlackPawn extends(或implementsFigure

代码气味

请注意,使用instanceof 通常不是好的设计。您可能想要使用isBlackPawn(Figure f) 方法,就像return f.getFigureType() == FigureType.PAWN &amp;&amp; f.getPlayerColor() == PlayerColor.WHITE 一样。

【讨论】:

  • 图是一个包 blackPawn 类没有扩展或没有实现任何东西。
  • @xCrazy 可能应该:)
  • 我认为我描述的问题真的很糟糕。所以我有一个名为“sample”的包,有“Figures”“Field”和“Sprites”包,Figures 包包含图形 Pawns Rooks(白色和黑色) 等等。我组中的节点是 The Figures 的 Images(ImageView),我只想如果节点是 blackpawn 图像然后将图像移动到坐标
  • @xCrazy 无关,但为什么白色和黑色棋子是不同的类别?如果我们谈论的是普通国际象棋,它们具有完全相同的行为,以及一个不同的属性,甚至不需要在类本身中,具体取决于事物的架构方式。
  • @xCrazy 我明白了。我回答的“演员”部分是你的主要问题,尽管你的班级设计。您确实需要以某种方式在节点和图形之间进行映射;通常,您不应该对图像进行操作,而是有一个包含实际数字的基础模型,这将是显示的内容,而不是相反的方式。但这对于这个特殊的铸造问题来说真的太过分了。
【解决方案2】:

java instanceof 运算符用于测试对象是否为指定类型(类或子类)的实例

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

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2018-02-18
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多