Java-Class.isInstance()始终返回false
在我的GameObject类中,我使用以下方法检查游戏对象在移动到指定位置时是否会与另一个对象发生碰撞:Java-Class.isInstance()始终返回false,java,class,reflection,instanceof,Java,Class,Reflection,Instanceof,在我的GameObject类中,我使用以下方法检查游戏对象在移动到指定位置时是否会与另一个对象发生碰撞: public boolean collisionAt(Vector2d position, Class<? extends GameObject>... exclusions) { if (getBounds() == null) return false; Rectangle newBounds = getBounds().clone();
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;
}
控制台输出错误!这里发生了什么?您需要传入相关类的实例,而不是类文本。例如
Spell spell = new Spell();
System.out.println(Spell.class.isInstance(spell));
来自官方Javadocs
public boolean isInstance(Object obj)
确定指定的对象是否与此类表示的对象兼容。此方法是Java语言instanceof运算符的动态等效方法。如果指定的对象参数为非null,并且可以强制转换为此类对象表示的引用类型,而不引发ClassCastException,则该方法将返回true。否则返回false
您需要传入类的对象,而不是类本身
范例
SomeClass object = new SomeClass();
System.out.println(SomeClass.class.isInstance(object));
isInstance
测试给定对象是否是类的实例,而不是给定的类是否是类的子类
你的调用是反向的。您需要测试gameObject
是否是其中一个排除类的实例
if (exclusion.isInstance(gameObject))
确定指定的对象是否与此类表示的对象兼容。当它需要一个对象时,您正在向它传递一个类
反之亦然:
Spell.class.isInstance(spell)
读这本书。使用isInstance时,仅当参数是该类的实例时,它才会返回true,而当参数是同一类对象时,则不会返回trueSpell.class.isInstance(new Spell())
返回true
。您没有向它传递该类型的实例,因此它返回false
这是java.lang.Class.isInstance()方法的声明-public boolean isInstance(Object obj)
我认为应该编写Someclass而不是Someobject,因为这是我们在这里指定的类名。这是正确的方法。
Spell.class.isInstance(spell)