当我在增强的for循环中使用泛型类中的数组getter时,为什么会出现ClassCastException?

时间:2018-01-28 00:50:55

标签: java arrays generics

我在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类中抛出任何数组,所以为什么会发生这种情况呢?

提前致谢。

0 个答案:

没有答案