在我的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;
}
我想允许程序定义排除项,例如,如果我不希望此方法在与法术冲突时返回true。但由于某种原因,Class.isInstance()行始终返回false。我甚至试过这个:
System.out.println(Spell.class.isInstance(Spell.class));
并且控制台输出错误!这是怎么回事?
答案 0 :(得分:5)
来自官方Javadocs
public boolean isInstance(Object obj)
确定指定的Object是否与此Class表示的对象分配兼容。此方法是Java语言instanceof运算符的动态等效项。如果指定的Object参数为非null,则该方法返回true,并且可以强制转换为此Class对象表示的引用类型,而不会引发ClassCastException。否则返回false。
你需要传入类的对象而不是类本身。
实施例
SomeClass object = new SomeClass();
System.out.println(SomeClass.class.isInstance(object));
答案 1 :(得分:5)
isInstance
测试给定对象是Class
的实例,而不是给定Class
是Class
的子类。
你的调用是向后的。您需要测试gameObject
是否是其中一个排除类的实例。
if (exclusion.isInstance(gameObject))
答案 2 :(得分:2)
您需要传入有问题的类的实例而不是类文字。 E.g。
Spell spell = new Spell();
System.out.println(Spell.class.isInstance(spell));
答案 3 :(得分:0)
isInstance 确定指定的对象是否与这个类表示的对象赋值兼容。当它需要一个对象时,您将它传递给一个类。
相反的应该起作用:
sample_df <- tibble::tribble(
~year, ~full_name, ~type, ~count, ~avg_score, ~max,
2021L, "Jason Valdez", "Sciences", "33", 98, 99,
2021L, "Jason Valdez", "Humanities", "59", 97, 99,
2020L, "Jason Valdez", "Sciences", "164", 97, 99,
2020L, "Jason Valdez", "Humanities", "231", 96, 98,
2019L, "Jason Valdez", "Sciences", "933", 96, 99,
2019L, "Jason Valdez", "Humanities", "853", 95, 99,
2021L, "Eric Collins", "Sciences", "21", 92, 93,
2019L, "Eric Collins", "Sciences", "831", 94, 97,
2019L, "Eric Collins", "Humanities", "10", 94, 97,
2021L, "Sebastian Goldberg", "Sciences", "41", 93, 96,
2020L, "Sebastian Goldberg", "Sciences", "476", 94, 98,
2020L, "Sebastian Goldberg", "Humanities", "81", 93, 96,
2019L, "Sebastian Goldberg", "Sciences", "1418", 95, 98
)
output_df <- tibble::tribble(
~year, ~full_name, ~type, ~count, ~avg_score, ~max,
2021L, "Jason Valdez", "Humanities", 59L, 95L, 96L,
2020L, "Jason Valdez", "Humanities", 231L, 96L, 98L,
2021L, "Eric Collins", "Sciences", 21L, 92L, 93L,
2019L, "Eric Collins", "Sciences", 831L, 94L, 97L,
2021L, "Sebastian Goldberg", "Sciences", 41L, 93L, 96L,
2020L, "Sebastian Goldberg", "Sciences", 476L, 94L, 98L
)