首页 > 解决方案 > 在这种情况下,为什么编译器不能解析实例方法的符号?

问题描述

假设一个类 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"

为什么我需要对编译器使用强制转换来允许我访问实例方法?

标签: javainterface

解决方案


该行的意思MyInterface myClass = new MyClass()是,“创建一个新MyClass的,然后忘记它的所有特性,除了那些在接口中定义的特性MyInterface。”

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


推荐阅读