所以我有这个CopyOnWriteArrayList,其中GameObject是一个接口。在整个程序中,我向这个arraylist添加了一堆不同类型的GameObjects。我想知道是否有可能迭代这个arraylist并检查GameObject是否是给定对象的实例(使用方法中的参数。这通常是我的意思:
public <T extends Object> List<T> getObjectsOfType(Class<T> type) {
ArrayList<T> list = new ArrayList<T>();
for (Object obj : objects) {
if (/*match?*/) {
list.add((T) obj);
}
}
return list;
}
那么在哪里说“匹配?”,我想检查对象是否与Class类型有任何关联。如果GameObject实现“type”,我也希望它能够工作。
感谢您的帮助!
答案 0 :(得分:4)
是的 - 您可以使用Class<T> type
的<{3}}方法:
if (type.isAssignableFrom(obj.getClass())) {
list.add((T) obj);
}
答案 1 :(得分:0)
您可以使用泛型来解决此问题。看来你的方法正在接受一个对象列表,所以我假设你将GameObject
放入一个看起来像这样的列表。
List<Object> gameObjects = new ArrayList<Object>();
如果您将列表切换为使用仅接受GameObject
的通用列表,则不需要进行类型检查。
List<GameObject> gameObjects = new ArrayList<GameObject>();
答案 2 :(得分:0)
您可以使用Class:
中的isInstance()方法if (type.isInstance(obj)) {
list.add(type.cast(obj));
}
我还建议使用类型。cast()方法来投射obj
而不是投射(T)
。后者将为您提供编译时警告,而使用type.cast()
则不会。