我在java中创建一个游戏,在这个过程中,我实现了一个名为ScrollingObjectHandler
的泛型类,它需要一个
游戏对象作为一个类型参数并处理它的运动,这个游戏对象必须扩展一个名为ScrollingObject
的抽象类,
这是处理程序的贬值:
public abstract class ScrollingObjectHandler<T extends ScrollingObject> {
private T objects[];
// other fields....
@SuppressWarnings("unchecked")
protected ScrollingObjectHandler(int size) {
//initialization of other fields....
objects = (T[]) new ScrollingObject[size];
for(int i = 0;i < size;i++) {
objects[i] = create();
}
}
// init each ScrollingObject
protected abstract T create();
// the getter for the contained array
public T[] getAll() {
return objects;
}
// rest of the code....
}
我使用这个类来处理两种类型的游戏对象;
Ground
:
public class Ground extends ScrollingObject {
// code....
}
和TubePair
:
public class TubePair extends ScrollingObject {
// code....
}
,这是我的主GameWorld类中的2个处理程序的初始化代码:
// initialization and decleration are separated in the class
ScrollingObjectHandler<TubePair> tubePairHandler = new ScrollingObjectHandler<TubePair>() {
@Override
public TubePair create() {
// returns a new TubePair
}
};
ScrollingObjectHandler<Ground> groundHandler = new ScrollingObjectHandler<Ground>() {
@Override
public Ground create() {
// returns a new Ground
}
};
当我使用此循环调用getAll()
检查另一个游戏对象与每个TubePair
对象的碰撞时:
for(TubePair tubePair : tubePairHandler.getAll()) {
// checking collision code....
}
,我得到ClassCastException
这样的话:
Exception in thread "LWJGL Application" java.lang.ClassCastException: [Lcom.maiconelements.flappybird.gameobjects.ScrollingObject; cannot be cast to [Lcom.maiconelements.flappybird.gameobjects.TubePair;
at com.maiconelements.flappybird.world.GameWorld.update(GameWorld.java:142) (this line -> for(TubePair tubePair : tubePairHandler.getAll()))
....
同样的问题也出现在类似的增强for循环中,它在另一个类中绘制Ground
个对象,这是Ground
数组的getter
来自GameWorld
类:
Ground[] getGrounds() {
return groundHandler.getAll();
}
,这就是理由:
for(Ground ground : world.getGrounds()) {
// drawing code....
}
,我也得到相同的ClassCastException
:
Exception in thread "LWJGL Application" java.lang.ClassCastException: [Lcom.maiconelements.flappybird.gameobjects.ScrollingObject; cannot be cast to [Lcom.maiconelements.flappybird.gameobjects.Ground;
at com.maiconelements.flappybird.world.GameWorld.getGrounds(GameWorld.java:87) (this line -> return groundHandler.getAll();)
....
我在这里做错了什么?
我实际上并没有尝试在ScrollingObjectHandler
类中抛出任何数组,所以为什么会发生这种情况呢?
提前致谢。