這取決於你想用這種類型的信息做什麼。這聽起來像你想創建給定類型的新對象,而不知道編譯時該類型是什麼。這意味着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