非常具体的Java泛型问题 - 如何返回传递给方法的相同类型?

时间:2013-07-15 21:39:42

标签: java generics types

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

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);
}

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

3 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:1)

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

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

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

ArrayList<T> list = new ArrayList<>;

修改

正如@arshajii在评论中指出的那样,e需要投放到T,以匹配list的类型。

答案 2 :(得分:-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);

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