在我的游戏引擎中,我有一个Entity
个对象列表,其中有许多子类(例如Player
,Cube
,Camera
等。我想有一个方法,我传递一个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中正确地做到这一点?
答案 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);
现在您不必转换列表中的每个对象。