这完全取决于您想对该类型信息做什么。听起来您想在编译时不知道该类型是什么的情况下创建给定类型的新对象。这意味着 Java 泛型,可用于向方法添加类型信息,如下所示:
<T> generateRoom(int x, int y, int width, int height)
行不通,因为你不能写new T()
. (Java 编译器会在运行前擦除通用信息)。
因此,您可以尝试将反射与泛型结合使用,在这种情况下,您可以将 Class 对象传递给您的方法,并使用 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);
}
有关在构造函数中使用反射的更多信息,请参见此处和此处。
或者,如果您不想冒反射的脆弱性的风险,您可以使用工厂模式并将您的方法传递给工厂以构造适当的 Tile:
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
implement TileFactory<TileType>
,例如TileFactory<StoneTile>
,并适当地参数化工厂的 getInstance 方法(public T getInstance()
)。