2014-12-27 66 views
0

我有一个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

您使用的是raw type的迭代器声明它没有关于存储在List

Iterator<T> iterator = objectList.iterator(); 
+0

谢谢!我无法相信在阅读了这么多文章之后我没有听到! – 2014-12-27 16:43:41

2

您需要输入迭代器以及各类信息...

Iterator itr = objectList.iterator(); 

变成

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

这样,当你打电话您的Iterator<T>上的.next()将返回类型为T的对象,而不仅仅是Object(如果未明确键入迭代器,则这是默认值)。

+0

是的,这也是有道理的。 – 2014-12-27 16:47:17

相关问题