在这种情况下,为什么编译器无法解析实例方法的符号?

Why can't the compiler resolve the symbol for instance method in this case?

假设一个 class MyClass 实现了一个接口 MyInterface,并且它有自己的实例方法,比如说 foo()。 当我像这样创建 MyClass 的实例时:

MyInterface myClass = new MyClass();

如果没有显式转换,编译器不允许我访问它的实例方法:

myClass.foo();  // Can't resolve symbol
((MyClass) myClass).foo(); // this is okay

即使编译器显然知道 myClass 是 MyClass 的一个实例:

if(myClass instanceof MyClass)
  System.out.println(myClass.getClass().getName()); //this will print "MyClass"

为什么我需要使用 cast for compiler 来允许我访问实例方法?

它可能是 MyClass 类型,但您将其视为 MyInterface。当您执行 A myVar = new B(); 时,即使 myVar 的类型为 B.

,您也只能访问在 A 中可以访问的任何内容

MyInterface myClass = new MyClass() 意思 是,“创建一个新的 MyClass,然后忘记它的所有功能,除了那些在界面中定义的MyInterface.

当您提到“编译器显然知道 myClass 是 MyClass 的一个实例”时,您实际上并不正确:不是编译器知道这一点,但是运行时。 编译器 被告知忘记该信息,它确实做到了。