java - 接口引用是否需要将强制转换分配给类对象引用?
问题描述
在复习 Java SE 8 Programmer I(以前称为 OCA)认证考试时,我遇到了以下声明:
“对接口的引用需要将显式转换分配给任何类的引用,即使是实现接口的类。接口引用需要将显式转换分配给类引用。”
我认为这有点不准确,因为可以将接口的引用分配给 Object 类的引用而无需显式强制转换。
interface Animal {}
public class Dog implements Animal {
public static void main(String[] args) {
Animal animal = new Dog();
Dog dog = animal; // Doesn't compile - requires explicit cast to Dog
Object o = animal; // Compiles
}
}
这是由于 Object 类和接口之间的链接类似于此答案中描述的与类文件格式相关的链接吗?
从这个与使用接口引用访问 Java Object 类方法相关的答案中,我总结了:
- 使用接口引用,您只能访问接口中定义的方法,而不能访问特定于类的方法。
- 接口具有 Object 类的“隐藏声明”方法。
- 您可以通过任何接口引用访问 Object 类的方法,因为尽管接口不是从 Object 类扩展而来,但 Java 中的每个根接口都隐含地声明了与 Object 类中的每个方法相对应的方法。
如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法 m,其签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s、返回类型为 r 和 throws 子句的公共实例方法 m在 Object 中声明,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的方法。
解决方案
推荐阅读
- c# - 为什么我的 prism 模板会从默认模板中给出 Android.views.InflateException?
- delphi - 如何将 TBitmap 分配给 TPath.Data
- java - 我应该如何从外部调用 JavaFX 中“Main”类中包含的方法?
- laravel - Laravel-admin:多对多关系不起作用
- android - Android,如果用户删除 SD 卡上的 SAF 树 uri(文件夹)。无法创建相同的文件夹
- azure-devops - 当“更改已经存在”时如何修复 YAML 文件转换任务?
- apache-spark-sql - 在 PowerQuery 中更新源:通过 ODBC 提取 Azure 数据
- r - 从 KableExtra 表对象以 R 笔记本格式正确呈现数学符号
- flutter - 如何确定一个偏移量是否包含在另一个偏移量区域中?
- c# - 在 SQL Server 中获取一组值