在下面的代码中,x的类型为I(尽管x也实现了J,但是在编译时还不知道),所以为什么(1)的代码不会导致编译时错误。
因为在编译时仅考虑引用的类型。

public class MyClass {
    public static void main(String[] args) {
        I x = new D();
        if (x instanceof J) //(1)
            System.out.println("J");
    }
}

interface I {}

interface J {}

class C implements I {}

class D extends C implements J {}

最佳答案

instanceof用于确定对象类型的运行时。您正在尝试确定x在程序运行时是否确实是J类型的对象,因此可以对其进行编译。

您是否认为它会导致编译时错误,因为您认为编译器不知道x的类型?

编辑

正如Kirk Woll所评论的(感谢Kirk Woll!),如果您正在检查x是否是instanceof的一个具体类,并且编译器可以确定x的类型,则在编译时会出错。

根据Java语言规范:



例如:

import java.io.Serializable;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

class SerializableClass implements Serializable
{
   private writeObject(ObjectOutputStream out) {}
   private readObject(ObjectInputStream in) {}
}

public class DerivedSerializableClass extends SerializableClass
{
   public static void main(String[] args)
   {
      DerivedSerializableClass dsc = new DerivedSerializableClass();

      if (dsc instanceof DerivedSerializableClass) {} // fine
      if (dsc instanceof Serializable) {} // fine because check is done at runtime
      if (dsc instanceof String) {} // error because compiler knows dsc has no derivation from String in the hierarchy

      Object o = (Object)dsc;
      if (o instanceof DerivedSerializableClass) {} // fine because you made it Object, so runtime determination is necessary
   }
}

10-05 17:47
查看更多