我有一个GameWorld
课程,其中update
和render
我的游戏大部分时间。在这个类中,我需要一个方法来删除离开屏幕边界的对象。此外,因为我的大部分游戏对象都存储在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().y
说Cannot resolve method getPosition()
时出现问题。
起初我认为extends
之后的第一件事应该是正常的课程。从我读到的这是真的,但只有你有接口和类的有界参数,所以这不是问题。 (来自文档:"If one of the bounds is a class, it must be specified first.")
注意:-AssetLoader.cloud.getHeight()
只是一个常数。我解决了这个问题后,我会改变它。
所以我的问题是:为什么我无法访问getPosition()
,即使传入deleteOffScreenObjects
的任何参数都实现了一个接口,以确保此方法可用并实现?
答案 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}}不要明确键入你的迭代器。)