Java 如何将对象类型传递给类?
我目前正在使用slick2D用java制作一个游戏。游戏是基于瓷砖的,我正在尝试随机生成地图。我正在生成一个房间和一个连接到该房间的走廊,并一直这样做,直到地图全部填满。我有一些方法,比如Java 如何将对象类型传递给类?,java,class,object,types,slick2d,Java,Class,Object,Types,Slick2d,我目前正在使用slick2D用java制作一个游戏。游戏是基于瓷砖的,我正在尝试随机生成地图。我正在生成一个房间和一个连接到该房间的走廊,并一直这样做,直到地图全部填满。我有一些方法,比如 generateRoom(int x, int y, int width, int height) 我的问题是我如何传递我想要在房间中使用的瓷砖类型。我想它可能看起来像这样 generateRoom(StoneTile, int x, int y, int width, int height) 显然,这是
generateRoom(int x, int y, int width, int height)
我的问题是我如何传递我想要在房间中使用的瓷砖类型。我想它可能看起来像这样
generateRoom(StoneTile, int x, int y, int width, int height)
显然,这是行不通的。我不想发送已经创建的实际磁贴,因为每个磁贴中都有一个特定的位置,在调用该方法时,我不知道磁贴的位置。我如何发送方法中要使用的类型?您可能只想发送
类
,因此请使用如下方式:
generateRoom(Class tileClass, int x, int y, int width, int height)
<T> generateRoom(int x, int y, int width, int height)
然后,您可以使用对象上的
getClass()
方法调用它。这完全取决于您想对该类型信息执行什么操作。听起来您想创建给定类型的新对象,而不知道编译时该类型是什么。这意味着Java泛型可以用于向如下方法添加类型信息:
generateRoom(Class tileClass, int x, int y, int width, int height)
<T> generateRoom(int x, int y, int width, int height)
有关在构造函数中使用反射的更多信息,请参见和
或者,如果您不想冒反射脆弱性的风险,您可以使用Factory模式并将您的方法传递给Factory,以构建适当的瓷砖:
generateRoom(TileFactory tileFactory, int x, int y, int width, int height) {
Tile myTile = tileFactory.getInstance();
}
为了做到这一点,您需要有一个所有瓷砖类型都实现的接口瓷砖
,以及每个混凝土瓷砖厂(即StoneTileFactory)实现的接口瓷砖厂
。然后,当调用该方法时,如果希望它创建StoneTiles,可以为其指定StoneTileFactory(适合TileFactory参数类型)
当然,如果您不想使用接口,甚至可以使用泛型对其进行参数化:
<T> generateRoom(TileFactory<T> tileFactory, int x, int y, int width, int height) {
T tile = tileFactory.getInstance()
}
generateRoom(平铺系数平铺系数、整数x、整数y、整数宽度、整数高度){
T tile=tileFactory.getInstance()
}
在这种情况下,您需要使
TileFactory
的每个实例实现TileFactory
,例如TileFactory
,并适当地参数化工厂的getInstance方法(public T getInstance()
) 我认为一种适合您需要的简单方法是创建一个表示平铺类型的枚举:
public enum TileType {
STONE,
WATER,
FIRE,
GRASS
}
然后,您可以通过如下方法传递类型:
TileType type = TileType.STONE;
generateRoom(type, x, y, width, height);
(...)
如果您以后需要为每个磁贴类型枚举添加参数或行为,请转到相应的位置。如果您使用Java 5,您可以使用ClassOr,在这种情况下比
getClass()
,StoneTile.class
更合适。