如何将对象类型传递给类?

时间:2012-07-22 06:32:25

标签: 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)

显然这不起作用。我不想发送已经创建的实际图块,因为每个图块中都有一个特定的位置,并且在调用方法时我不知道图块的位置。我如何才能发送方法中使用的类型?

3 个答案:

答案 0 :(得分:0)

您可能只想发送Class,请使用以下内容:

generateRoom(Class tileClass, int x, int y, int width, int height)

然后您可以使用对象上的getClass()方法调用它。

答案 1 :(得分:0)

这取决于您想要对该类型信息做什么。听起来您想要在编译时不知道该类型是什么的情况下创建给定类型的新对象。这意味着Java Generics,可用于向类似的方法添加类型信息:

<T> generateRoom(int x, int y, int width, int height)

不起作用,因为你不能写new T()。 (Java编译器在运行时之前擦除通用信息)。

因此,您可以尝试将Reflection与Generics结合使用,在这种情况下,您可以将Class对象传递给您的方法,并使用Java的Reflection实用程序为您提供的类找到构造函数。

<T> generateRoom(Class<T> tileClass, int x, int y, int width, int height) {
    Constructor<T> constructor = tileClass.getDeclaredConstructor(Arg1Type.class, Arg2Type.class);
    T tile = constructor.newInstance(arg1, arg2);
}

有关在构造函数中使用反射的详细信息,请参阅herehere

或者,如果您不想冒险反映的脆弱性,可以使用工厂模式并将您的方法传递给工厂以构建适当的平铺:

generateRoom(TileFactory tileFactory, int x, int y, int width, int height) {
    Tile myTile = tileFactory.getInstance();
}

为了做到这一点,你需要有一个所有tile类型实现的接口Tile,以及每个具体tile工厂(即StoneTileFactory)实现的接口TileFactory。然后当你调用方法时,如果你想要它创建StoneTiles,你可以给它一个StoneTileFactory(它适合TileFactory参数类型)。

当然,如果您不想使用接口,甚至可以使用泛型参数化:

<T> generateRoom(TileFactory<T> tileFactory, int x, int y, int width, int height) {
    T tile = tileFactory.getInstance()
}

在这种情况下,您需要设置TileFactory实现TileFactory<TileType>的每个实例,例如TileFactory<StoneTile>,并适当地参数化工厂的getInstance方法(public T getInstance())。

答案 2 :(得分:0)

我认为一种符合您需求的简单方法是创建一个表示图块类型的枚举:

public enum TileType {
    STONE,
    WATER,
    FIRE,
    GRASS
}

然后你可以通过你的方法传递类型:

TileType type = TileType.STONE;
generateRoom(type, x, y, width, height);
(...)

如果您以后需要为每个磁贴类型枚举添加参数或行为,请转到a long way以适应此目的。