Java - Class.isInstance()始终返回false

MCM*_*ery 5 java reflection class instanceof

在我的GameObject类中,我有以下方法来检查GameObject是否会在移动到指定位置时与另一个对象发生碰撞:

public boolean collisionAt(Vector2d position, Class<? extends GameObject>... exclusions) {
    if (getBounds() == null)
        return false;
    Rectangle newBounds = getBounds().clone();
    newBounds.setPosition(position);
    // Check collisions
    for (GameObject object : new ArrayList<>(gameObjects)) {
        if (object.getBounds() != null && newBounds.intersects(object.getBounds()) && object != this) {
            boolean b = true;
            for (Class<? extends GameObject> exclusion : exclusions) {
                if (object.getClass().isInstance(exclusion))
                    b = false;
            }
            if (b)
                return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我想允许程序定义排除项,例如,如果我不希望此方法在与法术冲突时返回true.但由于某种原因,Class.isInstance()行始终返回false.我甚至试过这个:

System.out.println(Spell.class.isInstance(Spell.class));
Run Code Online (Sandbox Code Playgroud)

并且控制台输出错误!这里发生了什么?

Sne*_*neh 5

来自官方Javadocs

public boolean isInstance(Object obj)
Run Code Online (Sandbox Code Playgroud)

确定指定的Object是否与此Class表示的对象分配兼容.此方法是Java语言instanceof运算符的动态等效项.如果指定的Object参数为非null,则该方法返回true,并且可以强制转换为此Class对象表示的引用类型,而不会引发ClassCastException.否则返回false.

您需要传入类的对象而不是类本身.

SomeClass object = new SomeClass();
System.out.println(SomeClass.class.isInstance(object));
Run Code Online (Sandbox Code Playgroud)


rge*_*man 5

isInstance给定对象是否是的一个实例的测试Class,而不是如果给定的Class是的一个子类Class

您有向后调用。您需要测试是否gameObject是其中一个排除类的实例。

if (exclusion.isInstance(gameObject))
Run Code Online (Sandbox Code Playgroud)