这完全取决于您想对该类型信息做什么。听起来您想在编译时不知道该类型是什么的情况下创建给定类型的新对象。这意味着 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);
}
请参阅here 和here,了解有关在构造函数中使用反射的更多信息。
或者,如果您不想冒反射的脆弱性,您可以使用工厂模式并将您的方法传递给工厂以构造适当的 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 的每个实例都实现TileFactory<TileType>,例如TileFactory<StoneTile>,并适当地参数化工厂的getInstance 方法(public T getInstance())。