【问题标题】:instanceof in Java - why doesn't this compile? [duplicate]Java中的instanceof - 为什么不编译? [复制]
【发布时间】:2013-08-31 13:01:18
【问题描述】:
class A {

    public static void main(String...args) {
        Integer var = 10; 

        if(var instanceof Character)  // Line1
            System.out.println("var is a Character");
    }
}

我知道 第 1 行 不会编译,因为编译器发现 var 不是 Character

我不明白为什么编译器会抛出错误而不是返回falsetrue

如果编译器返回falsetrue(即将instanceof 操作视为常规的基于if 的验证),那么它会更有用.. 不是吗?

还是我遗漏了一些明显的东西?

【问题讨论】:

  • Integer var = 10; 更改为Object var = 10;。编译器告诉您,如果您将 var 声明为 Integer,则 var 不能永远成为 instanceof Character
  • 为什么会被否决?这是一个非常合理的问题。
  • @RohitJain 我的想法完全正确。
  • 我想如果你想要类似于instanceof 的检查,但不是抛出错误,而是返回false,你可以试试Character.class.isInstance(var),在这种情况下会返回false。跨度>
  • @JoshM 查看我对other answer 的评论。 JLS 指定抛出错误是有充分理由的。如果您只需要 varInteger,那么您到底为什么要检查它是否不是?除非你的记忆力特别短……

标签: java instanceof


【解决方案1】:

按照JLS §15.20.2是编译错误:

如果将 RelationalExpression 转换为 ReferenceType 会因为编译时错误而被拒绝,那么 instanceof 关系表达式同样会产生编译-时间错误。在这种情况下,instanceof 表达式的结果永远不会为真。

RelationalExpressioninstanceof 的第一个操作数,ReferenceType 是第二个。

【讨论】:

    【解决方案2】:

    除了 arshajii 的回答之外如果你想避免编译时错误并希望运行时 true/false 结果来检查 var 是否是 Character 的实例,那么使用这样的代码: p>

    if(var.getClass().isAssignableFrom(Character.class))
        System.out.println("var is a Character");
    else
        System.out.println("var is NOT a Character");
    

    正如你所期望的那样,它会打印出来:

    var is NOT a Character
    

    【讨论】:

    • 我认为 JLS 的基本点是,如果您知道类型不可分配,则此检查可以永远返回 true。这完全没有意义——如果你知道它是Integer,那么这个检查是多余的,return false 也可以。如果您不知道varInteger,即您有一个Object,那么instanceof 将编译得很好。
    • 它很有用,如果我想在某些情况下做更少的代码。我在开发阶段有共享模式的人行横道项目和用于生产的嵌入式模式,我使用if (this instanceof XWalkActivity) 进行检查,但它编译错误。 https://crosswalk-project.org/documentation/shared_mode.html
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2017-01-07
    • 2015-05-17
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多