如何获取静态对象属性的class

How to get the class of a static object attribute

我有一个父 class Tile 并继承了 classes Walltile、FloorTile、EntityTile。每个继承的 class 都有与其名称相关的 BufferedImage 属性。

public class WallTile extends Tile {

public static BufferedImage WATER_TOP_LEFT = Game.tilesSpritesheet.getSprite(34, 0);
public static BufferedImage WATER_TOP = Game.tilesSpritesheet.getSprite(51, 0);
public static BufferedImage WATER_TOP_RIGHT = Game.tilesSpritesheet.getSprite(68, 0);
public static BufferedImage WATER_LEFT = Game.tilesSpritesheet.getSprite(34, 17);
public static BufferedImage WATER_CENTER = Game.tilesSpritesheet.getSprite(51, 17);
public static BufferedImage WATER_RIGHT = Game.tilesSpritesheet.getSprite(68, 17);
public static BufferedImage WATER_BOTTOM_LEFT = Game.tilesSpritesheet.getSprite(34, 34);
public static BufferedImage WATER_BOTTOM = Game.tilesSpritesheet.getSprite(51, 34);
public static BufferedImage WATER_BOTTOM_RIGHT = Game.tilesSpritesheet.getSprite(68, 34);
public static BufferedImage WATER_LITTLE_TOP_LEFT = Game.tilesSpritesheet.getSprite(17, 34);

public WallTile(BufferedImage sprite, int x, int y) {
    super(sprite, x, y);
}
}

public class FloorTile extends Tile {

public static BufferedImage TILE_GRASS = Game.tilesSpritesheet.getSprite(85, 0);
public static BufferedImage TILE_SAND = Game.tilesSpritesheet.getSprite(136, 0);

public FloorTile(BufferedImage sprite, int x, int y) {
    super(sprite, x, y);
}
}

public class EntityTile extends Tile {

public static BufferedImage TILE_TREE_1 = Game.tilesSpritesheet.getSprite(221, 153);
public static BufferedImage TILE_TALL_GRASS = Game.tilesSpritesheet.getSprite(374, 187);

public static List<BufferedImage> spriteList = new ArrayList<BufferedImage>();

// Construtor
public EntityTile(BufferedImage sprite, int x, int y) {
    super(sprite, x, y);
}

@Override
public void render(Graphics g) {
    g.drawImage(FloorTile.TILE_GRASS, x - Camera.x, y - Camera.y, null);
    g.drawImage(sprite, x - Camera.x, y - Camera.y, null);
}
}

我实例化 Tile,然后转换为特定的 class,例如:

Tile tile = new Tile(sprite, 0, 0);
WallTile wt = (WallTile) tile;

但我需要知道这个 Tile 对象是 WallTile、FloorTile 还是 EntityTile。为此,我具有对应于我想要的 ****Tile class 的 sprite 属性。我怎样才能得到这个信息?当我使用 sprite.getClass() 时,它 returns BufferedImage,但我需要 return,如 WallTile、FloorTile 或 EntityTile。 为此:

if (tile.sprite.getClass().toString() == "class World.WallTile")
    //do something

您的这行代码不会创建WallTile对象。

Tile tile = new Tile(sprite, 0, 0);

上面的行创建了一个 Tile 对象,因此不能转换为 WallTile

我在你的问题中找不到 class Tile 的代码,但我想你应该将其抽象化 class 并提供构造函数 protected访问以避免直接构造 Tile 个对象。

考虑 class Furniture 及其子 class Table。我可以创建一个 Table 但我不能创建一个 Furniture 因为 Furniture 是一个通用术语。它的目的是存储所有类型家具的共同属性。

类似地,您的 Tile class 是一个基础 class,它仅存储 WallTileFloorTile 和 [=28= 共有的属性].

以下代码行将创建一个 WallTile 作为 Tile 对象,因此可以进行转换。

Tile tile = new WallTile(sprite, 0, 0); // 'tile' is actually 'WallTile' instance
WallTile wallTile = (WallTile) tile;

class Tilesprite 属性是一个 BufferedImage,无论它属于何种类型的对象。所以spriteclass总是BufferedImage。您可以做的是检查 sprite 它实际上是什么,因为 sprite 的所有可能值必须是您定义的常量之一。

因此,为了确定 Tile 对象是否实际上是 WallTile,例如,您可以执行以下操作:

if (sprite == WallTile.WATER_TOP_LEFT ||
    sprite == WallTile.WATER_TOP      ||
    // etc) {
}

不过,我想知道您为什么需要这样做。您没有 post minimal, reproducible example,因此缺少上下文。我不知道您如何获得 Tile 对象以及为什么需要确定 Tile 的实际类型。尽管如此,你能不能简单的做到以下几点?

if (tile instanceof WallTile)