这取决于你想用这种类型的信息做什么。这听起来像你想创建给定类型的新对象,而不知道编译时该类型是什么。这意味着Java的泛型,它可以用来类型信息添加到像这样的方法:
<T> generateRoom(int x, int y, int width, int height)
是行不通的,因为你不能写new T()
。 (Java编译器在运行前擦除通用信息)。
所以,你可以尝试使用反射结合泛型,在这种情况下,你可以在一个类的对象传递给你的方法和使用Java的反射工具来找到你给它的类的构造函数。
<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);
}
here见和here的更多信息,使用反射与构造。
或者,如果你不想冒险反射的脆弱性,你可以使用工厂模式,并通过你的方法一厂,构建合适的瓷砖:
generateRoom(TileFactory tileFactory, int x, int y, int width, int height) {
Tile myTile = tileFactory.getInstance();
}
为了做到这一点,你需要有一个接口Tile
您所有的瓷砖类型的实现和接口TileFactory
每个混凝土瓦厂(即StoneTileFactory)实现。然后当你调用方法时,如果你想要它创建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()
)。
如果您使用的是Java 5,您可以使用Class <?扩展StoneTitle>以进一步限制参数为特定类型(或子类型) – MadProgrammer 2012-07-22 06:58:56
或者,对于这种情况比'getClass()'''StoneTile.class'更适合。 – Dolda2000 2012-07-22 07:01:29