【问题标题】:Java - Class.isInstance() always returns falseJava - Class.isInstance() 总是返回 false
【发布时间】:2015-09-14 00:41:13
【问题描述】:

在我的 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;
}

我希望允许程序定义排除项,例如,如果我不希望此方法在与 Spell 冲突时返回 true。但出于某种原因,Class.isInstance() 行总是返回 false。我什至试过这个:

System.out.println(Spell.class.isInstance(Spell.class));

控制台输出错误!这是怎么回事?

【问题讨论】:

  • 阅读docs。使用 isInstance 时,仅当参数是该类的实例时才返回 true,而不是当参数是同一个类对象时返回 true。 Spell.class.isInstance(new Spell()) 返回true。您没有向它传递该类型的实例,因此它返回 false
  • 这是 java.lang.Class.isInstance() 方法的声明-public boolean isInstance(Object obj)

标签: java class reflection instanceof


【解决方案1】:

isInstance 确定指定的Object 是否与由this Class 表示的对象赋值兼容。当它需要一个对象时,您正在向它传递一个类。

反之亦然:

Spell.class.isInstance(spell)

【讨论】:

    【解决方案2】:

    来自官方 Javadocs

    public boolean isInstance(Object obj)
    

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

    你需要传入类的对象而不是类本身。

    例子

    SomeClass object = new SomeClass();
    System.out.println(SomeClass.class.isInstance(object));
    

    【讨论】:

    • 我认为写 Someclass 而不是 Someobject 是合适的,因为它是我们在这里指定的类名。
    【解决方案3】:

    isInstance 测试给定对象是否是Class 的实例,而不是测试给定Class 是否是Class 的子类。

    你的调用倒退了。您需要测试 gameObject 是否是排除类之一的实例。

    if (exclusion.isInstance(gameObject))
    

    【讨论】:

      【解决方案4】:

      您需要传入相关类的实例而不是类文字。例如

      Spell spell = new Spell();
      System.out.println(Spell.class.isInstance(spell));
      

      【讨论】:

        猜你喜欢
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2016-07-20
        • 2021-11-05
        • 2018-11-05
        • 2019-05-06
        相关资源
        最近更新 更多