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) 显然,这是

我目前正在使用slick2D用java制作一个游戏。游戏是基于瓷砖的,我正在尝试随机生成地图。我正在生成一个房间和一个连接到该房间的走廊,并一直这样做,直到地图全部填满。我有一些方法,比如

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
更合适。