1

所以我有这个 CopyOnWriteArrayList,其中 GameObject 是一个接口。在整个程序中,我向这个数组列表中添加了一堆不同类型的游戏对象。我想知道是否可以遍历这个数组列表并检查 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 实现“类型”,我也希望它能够工作。

谢谢您的帮助!

4

3 回答 3

4

是的-您可以使用isAssignableFrom以下方法Class<T> type

if (type.isAssignableFrom(obj.getClass())) {
    list.add((T) obj);
}
于 2013-04-24T00:11:56.813 回答
0

你可以使用泛型来解决这个问题。看来您的方法正在接受对象列表,所以我假设您将GameObjects 放入一个看起来像这样的列表中。

List<Object> gameObjects = new ArrayList<Object>();

如果您将列表切换为使用仅接受的泛型,GameObject则无需进行类型检查。

List<GameObject> gameObjects = new ArrayList<GameObject>();
于 2013-04-24T00:13:39.690 回答
0

您可以使用Class 中的isInstance()方法:

if (type.isInstance(obj)) {
    list.add(type.cast(obj));
}

我还建议使用类型。cast()方法用于强制转换obj而不是强制转换(T)。后者会给你一个编译时警告,而 usingtype.cast()不会。

于 2013-04-24T03:17:03.527 回答