それは、その型情報で何をしたいかによって異なります。コンパイル時にそのタイプが何であるかを知らなくても、指定されたタイプの新しいオブジェクトを作成したいようです。これは、次のようなメソッドに型情報を追加するために使用できる 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);
}
コンストラクタでリフレクションを使用する方法の詳細については、こちらとこちらを参照してください。
あるいは、リフレクションの脆弱性を危険にさらしたくない場合は、Factory パターンを使用し、メソッドに Factory を渡して適切なタイルを構築できます。
generateRoom(TileFactory tileFactory, int x, int y, int width, int height) {
Tile myTile = tileFactory.getInstance();
}
これを行うには、Tile
すべてのタイル タイプが実装するインターフェイスTileFactory
と、各コンクリート タイル ファクトリ (つまり、StoneTileFactory) が実装するインターフェイスが必要です。その後、メソッドを呼び出すときに、StoneTiles を作成する場合は、StoneTileFactory (TileFactory パラメーターの型に適合) を指定できます。
もちろん、インターフェイスを使用したくない場合は、これでも Generics でパラメーター化できます。
<T> generateRoom(TileFactory<T> tileFactory, int x, int y, int width, int height) {
T tile = tileFactory.getInstance()
}
この場合、 などのTileFactory
implementの各インスタンスを作成し、ファクトリの getInstance メソッドを適切にパラメータ化する必要があります ( )。TileFactory<TileType>
TileFactory<StoneTile>
public T getInstance()