我目前正在用 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 ...
}
这应该是我的数组包装类。我在加载关卡时创建此数组。在游戏的更新和渲染方法中,我只迭代了aliveElements - 数组的元素。
MyInterface 包含方法存根,例如update和render ...
现在,每当我发射子弹时,我都会在位置aliveElements的 Element 上调用一些init方法。我这样做是为了避免垃圾收集。
myCoolArray.get( myCoolArray.aliveElements ).init( ... )
无论我如何尝试实例化数组中的每个元素,这都是由于ClassCastException而失败的部分。
注意:我很清楚在上面的例子中我会得到一个NullPointerException因为我没有实例化元素!那不是问题。
谷歌,一些书籍和其他问题告诉我,泛型类型不能在 Java 中实例化。所以现在我的问题是:有没有办法解决这个问题?
我不想在更新或渲染方法中分配新对象,因为我害怕垃圾收集器会不时对帧速率做些什么:)