java - 在这种情况下,为什么编译器不能解析实例方法的符号?
问题描述
假设一个类 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"
为什么我需要对编译器使用强制转换来允许我访问实例方法?
解决方案
该行的意思MyInterface myClass = new MyClass()
是,“创建一个新MyClass
的,然后忘记它的所有特性,除了那些在接口中定义的特性MyInterface
。”
当您提到“编译器显然知道 myClass 是 MyClass 的一个实例”时,您实际上并不正确:知道这一点的不是编译器,而是运行时。编译器被告知忘记 该信息,它确实做到了。
推荐阅读
- r - `$<-.data.frame ..... 替换有 X 行,数据有 Y
- flutter - 返回类型不是闭包上下文所要求的小部件
- python-3.x - fastai:使用预先拆分的数据集评估表格预测模型
- r - 合并 R 数据框中的单元格并将结果下载为 Excel 表
- python - 如何从 python 列表创建 tensorflow RaggedTensor?
- wysiwyg - 如何将表情符号添加到 ProseMirror?
- javascript - JavaScript自定义模块不起作用,请帮助
- javascript - 更新动态生成元素的属性
- reactjs - 如何解决从 mongodb 中删除项目的问题?
- vue.js - 如何获取组件 q-toolbar-title 的文本?