Java 为什么可以';在这种情况下,编译器是否为实例方法解析符号?

Java 为什么可以';在这种情况下,编译器是否为实例方法解析符号?,java,interface,Java,Interface,假设一个类MyClass实现了一个接口MyInterface,并且它有自己的实例方法,比如foo()。 当我创建MyClass的实例时,如下所示: MyInterface myClass = new MyClass(); 编译器不允许我在没有显式强制转换的情况下访问其实例方法: myClass.foo(); // Can't resolve symbol ((MyClass) myClass).foo(); // this is okay 即使编译器显然知道myClass是myClass的

假设一个类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()时
您只能访问
A
中可以访问的任何内容,即使
myVar
属于
B

类型,它可能属于
MyClass
类型,但您将其视为
MyInterface
。当您执行
A myVar=new B()时
您只能访问
A
中可以访问的任何内容,即使
myVar
属于
B

MyInterface myClass=new myClass()
的含义是,创建一个新的
MyClass
,然后忘记它的所有功能,界面
MyInterface
中定义的功能除外

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

MyInterface myClass=new myClass()
的意思是创建一个新的
MyClass
,然后忘记它的所有特性,界面
MyInterface
中定义的特性除外


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

因为您告诉编译器将
myClass
视为
MyInterface
实例,所以它只能访问
MyInterface
方法。编译器正在执行您要求它执行的操作。如果您想调用
MyClass
方法(不强制转换),那么您将使用
MyClass
类型的变量。这是否回答了您的问题?这表明了多态性。您可以根据变量声明的类型将MyClass的实例视为MyClass、My实例或对象,因为您告诉编译器将
MyClass
视为
MyInterface
实例,因此它只能访问
MyInterface
方法。编译器正在执行您要求它执行的操作。如果您想调用
MyClass
方法(不强制转换),那么您将使用
MyClass
类型的变量。这是否回答了您的问题?这表明了多态性。根据变量声明的类型,可以将MyClass的实例视为MyClass、My实例或对象