私は現在Javaでゲームを書いています。このゲームでは、弾丸などのデータ構造として配列を使用しています。ここで、ジェネリック型を使用して配列のラッパー クラスを作成できませんでした。私の問題を示すために、次の例を作成しました。
public class CoolArray< E extends MyInterface > {
private final E[] array;
public int aliveElements;
public CoolArray( final Class< ? extends MyInterface > clazz, int size ) {
array = (E[])Array.newInstance( clazz, size );
for ( int i = 0; i < array.length; i++ ) {
// i would like to instantiate all array elements
// to avoid constant object allocation at runtime
try {
array[i] = clazz.newInstance(); // always throws NullPointerException
} catch ( Exception e ) { } // omitted
}
aliveElements= 0;
}
public E get( int i ) {
return array[ i ];
}
// rest omitted ...
}
これは、私の配列ラッパー クラスである必要があります。レベルがロードされたときにこの配列を作成します。ゲームのupdateメソッドとrenderメソッドでは、配列のaliveElements -Elements のみを繰り返します。
MyInterface には、 updateやrenderなどのメソッド スタブが含まれています...
これで、弾丸を発射するたびに、aliveElementsの位置にある Element で何らかのinitメソッドを呼び出します。ガベージコレクションを避けるためにこれを行います。
myCoolArray.get( myCoolArray.aliveElements ).init( ... )
そして、これは、配列内のすべての要素をどのようにインスタンス化しようとしても、 ClassCastExceptionが原因で失敗する部分です。
注:上記の例では、要素をインスタンス化していないため、 NullPointerExceptionが発生することをよく知っています! それは問題ではありません。
Google、いくつかの本、その他の質問から、Java ではジェネリック型をインスタンス化できないことがわかりました。だから今私の質問は:これを回避する方法はありますか?
updateメソッドまたはrenderメソッドで新しいオブジェクトを割り当てたくありません。ガベージ コレクターが時々フレームレートに何をするかが怖いからです :)