有界类型参数不允许访问适当对象的方法

时间:2014-12-27 16:38:07

标签: java generics interface libgdx

我有一个GameWorld课程,其中updaterender我的游戏大部分时间。在这个类中,我需要一个方法来删除离开屏幕边界的对象。此外,因为我的大部分游戏对象都存储在ArrayLists中,所以我需要制作一个通用方法,可以为多种类型的对象完成这项工作。这说我知道为了让这个与泛型一起使用那些"对象"必须相互关联:通过继承或接口。这就是我试过的:

我有一个名为WorldEntities的界面,它广泛地反映了游戏中每个实体应该做的事情。这是:

public interface WorldEntities {
    void update(float delta, GameWorld game);
    void render(SpriteBatch batch);
    Vector2 getPosition();
    Rectangle getBounds();
}

使用这个界面我尝试创建一个通用方法,可以删除任何离开屏幕边界的对象。这是我的尝试:

public <T extends WorldEntities> void deleteOffScreenObjects(ArrayList<T> objectList){
     Iterator itr = objectList.iterator();
     while (itr.hasNext()){
         if(itr.next().getPosition().y < -AssetLoader.cloud.getHeight()){
            itr.remove();
         }
     }
}

此方法在itr.next().getPosition().yCannot resolve method getPosition()时出现问题。

起初我认为extends之后的第一件事应该是正常的课程。从我读到的这是真的,但只有你有接口和类的有界参数,所以这不是问题。 (来自文档:"If one of the bounds is a class, it must be specified first."

注意:-AssetLoader.cloud.getHeight()只是一个常数。我解决了这个问题后,我会改变它。

所以我的问题是:为什么我无法访问getPosition(),即使传入deleteOffScreenObjects的任何参数都实现了一个接口,以确保此方法可用并实现?

2 个答案:

答案 0 :(得分:2)

您使用raw type作为Iterator声明,其中没有关于List

中存储的类型的信息
Iterator<T> iterator = objectList.iterator();

答案 1 :(得分:2)

您还需要输入迭代器...

Iterator itr = objectList.iterator();

变为

Iterator<T> itr = objectList.iterator();

这样,当您在.next()上致电Iterator<T>时,您将收到T类型的对象,而不仅仅是Object(如果您是{{1}}不要明确键入你的迭代器。)