【问题标题】:instanceof operator in java for comparing different classesjava中的instanceof运算符用于比较不同的类
【发布时间】:2012-02-24 20:17:52
【问题描述】:

我试图了解 Java 中的 instanceof 运算符是如何工作的,但遇到了一个非常奇怪的问题。

public static void main(String[] args) {
    Map m = new HashMap();
    System.out.println("m instanceof Date: " + (m instanceof Date));
}

上面的结果如预期的那样返回 false。然而,

public static void main(String[] args) {
    HashMap m = new HashMap();
    System.out.println("m instanceof Date: " + (m instanceof Date));
}

这甚至不能编译。我收到一个错误

inconvertible types
found   : java.util.HashMap
required : java.util.Date

我在这里缺少什么? 我正在使用 IntelliJ Idea 11。

【问题讨论】:

    标签: java instanceof


    【解决方案1】:

    来自 Java 语言规范 3.0,第 15.20.2 节:

    如果将 RelationalExpression 转换为 ReferenceType 将是 被拒绝为编译时错误,然后是 instanceof 关系 表达式同样会产生编译时错误。在这样一个 在这种情况下,instanceof 表达式的结果永远不会是 真的。

    由于您无法编译从 HashMapDate 的转换,因此您也无法在两者之间编译 instanceof 测试。

    【讨论】:

      【解决方案2】:

      您声明一个Map m 并使用instanceof,因为Map 是一个interface,这是一个新类可以extends Date implements Map。其他(非 Date)抽象类或类导致编译错误。

      public static void main(String[] args) {
          Map m = new HashMap();
          System.out.println("m instanceof Date: " + (m instanceof Date));
      }
      

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:

          在我看来,@Bon Espresso 几乎说出了正确的答案。这是我的小补充:

          您必须了解 instanceof 的真正作用,因此定义:

          instanceof 是一个二元运算符,用于检查 instance 是否属于某种类型

          所以,当你这样做时:

           Map m = new HashMap();
          

          在编译时 m 实际上是一个接口,但是针对 instanceof 的实际测试发生在运行时使用实例而不是接口,因此编译器无法确定如果 m 后面的实例(实现此接口的某个类)实际上是一个可以扩展 Date 的类。

          我的意思是你可以有一个这样的声明类:

          class MyClass extends Date implements Map{
               .....
          }
          

          然后你可以这样做:

           Map myMap = new MyClass();
           (myMap instanceof Date) 
          

          这将是完全合法的,因为 MyClass 实际上扩展了 Date。

          如您所见,这里的想法是,如果使用 instanceof 的检查成功的可能性很小,编译器就不会抱怨。

          另一方面,在您的第二个示例中:

              HashMap m = new HashMap();
          

          您正在声明 Map 接口的实际实现,或 实例。在这种情况下,编译器确定 HashMap 没有扩展 Date,从而给您错误。

          【讨论】:

          • 完全同意......当我在编译器中尝试同样的事情时发现了这一点......必须说你说得非常优雅:)
          猜你喜欢
          • 2020-07-17
          • 2012-07-29
          • 1970-01-01
          • 2014-06-02
          • 2016-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多