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)
并且控制台输出错误!这里发生了什么?
来自官方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)
在isInstance
给定对象是否是的一个实例的测试Class
,而不是如果给定的Class
是的一个子类Class
。
您有向后调用。您需要测试是否gameObject
是其中一个排除类的实例。
if (exclusion.isInstance(gameObject))
Run Code Online (Sandbox Code Playgroud)