在这种情况下,为什么编译器无法解析实例方法的符号?
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 的一个实例”时,您实际上并不正确:不是编译器知道这一点,但是运行时。 编译器 被告知忘记该信息,它确实做到了。
假设一个 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 的一个实例”时,您实际上并不正确:不是编译器知道这一点,但是运行时。 编译器 被告知忘记该信息,它确实做到了。