如何获取静态对象属性的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,它仅存储 WallTile
、FloorTile
和 [=28= 共有的属性].
以下代码行将创建一个 WallTile
作为 Tile
对象,因此可以进行转换。
Tile tile = new WallTile(sprite, 0, 0); // 'tile' is actually 'WallTile' instance
WallTile wallTile = (WallTile) tile;
class Tile
的 sprite
属性是一个 BufferedImage
,无论它属于何种类型的对象。所以sprite
的class将总是是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)
我有一个父 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,它仅存储 WallTile
、FloorTile
和 [=28= 共有的属性].
以下代码行将创建一个 WallTile
作为 Tile
对象,因此可以进行转换。
Tile tile = new WallTile(sprite, 0, 0); // 'tile' is actually 'WallTile' instance
WallTile wallTile = (WallTile) tile;
class Tile
的 sprite
属性是一个 BufferedImage
,无论它属于何种类型的对象。所以sprite
的class将总是是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)