4

在我的游戏引擎中,我有一个Entity对象列表,其中有许多子类(例如PlayerCubeCamera等)。我想要一个方法,在其中传递一个Class对象,并最终得到一个相同类的 List - 例如,我想说这样的话:

List<Box> boxes = getEntities(Box.class);

到目前为止,我有这个:

public List<Entity> getEntities(Class<? extends Entity> t) {
    ArrayList<Entity> list = new ArrayList<>();

    for (Entity e : entities) {
        if (e.getClass() == t) {
            list.add(e);
        }
    }

    return Collections.unmodifiableList(list);
}

但当然这会返回一个Entitys 列表,这意味着列表中的每个实例都必须强制转换为Box类。有没有办法在 Java 中正确地做到这一点?

4

3 回答 3

3

我推荐以下内容,它建立在现有答案的基础上,但避免了@SuppressWarnings等:

public <E extends Entity> List<E> getEntities(Class<E> type) {

    List<E> list = new ArrayList<>();

    for (Entity e : entities) {
        if (type.isInstance(e)) {
            list.add(type.cast(e));
        }
    }

    return Collections.unmodifiableList(list);
}

或者,如果您使用的是Guava

public <E extends Entity> ImmutableList<E> getEntities(Class<E> type) {
    return ImmutableList.copyOf(Iterables.filter(entities, type));
}
于 2013-07-15T22:39:28.910 回答
1

使您的方法具有通用性,并具有上限。

public <T extends Entity> List<T> getEntities(Class<T> t) {

然后在代码的下一行Entity替换为。T

ArrayList<T> list = new ArrayList<>;

编辑

正如@arshajii 在评论中指出的那样,e将需要强制转换为T, 以匹配list.

于 2013-07-15T21:42:46.347 回答
-2

尝试这个:

public static List<? extends Entity> getEntities(Class<? extends Entity> t) {
    ArrayList<Entity> list = new ArrayList<Entity>();

    for (Entity e : entities) {
        if (e.getClass() == t) {
            list.add(e);
        }
    }

    return Collections.unmodifiableList(list);
}

然后你可以打电话:

List<Box> boxes = (List<Box>) getEntities(Box.class);

现在您不必强制转换列表中的每个对象。

于 2013-07-15T22:04:10.960 回答