java - 在另一个默认方法中从其他接口调用默认方法
问题描述
此代码崩溃:
public class MyClass {
public static void main(String args[]) {
Person person = new Person();
person.selectMe();
}
}
class Entity {}
interface EntityNameable<T extends Entity> {
default String getSomething() {
return "";
}
}
interface EntityNameableSelectable<T extends EntityNameable> {
default String selectMe() {
return ((EntityNameable) this).getSomething();
}
}
class Person extends Entity implements EntityNameableSelectable {
}
此代码可以通过复制粘贴到https://www.jdoodle.com/online-java-compiler来执行
Exception in thread "main" java.lang.ClassCastException: Person cannot be cast to EntityNameable
at EntityNameableSelectable.selectMe(MyClass.java:18)
at MyClass.main(MyClass.java:4)
它崩溃是因为person
无法转换为EntityNameable
. 为什么不?Aperson
始终是Entity
,EntityNamable
对EntityNameableSelectable
吗?
我也想知道为什么我需要将它转换EntityNameable
为调用方法getSomething
,因为每个实现类都应该有那个方法。为什么需要演员表?它必须与崩溃有关...
解决方案
我也想知道为什么我需要将它转换为 EntityNameable 来调用方法 getSomething,因为每个实现类都应该有那个方法。
EntityNameableSelectable
不是一个EntityNameable
。EntityNameableSelectable
不扩展该接口,因此不会继承任何方法。
可能,您想EntityNameableSelectable
扩展EntityNameable
,因此您可以调用getSomething()
.
interface EntityNameableSelectable<T extends Entity> extends EntityNameable<T> {
default String selectMe() {
return getSomething();
}
}
A
Person
总是Entity
,EntityNamable
和EntityNameableSelectable
, 对吧?
仅当EntityNameableSelectable
extendsEntityNameable
或Person
implements EntityNameable
。
如果您按照EntityNameableSelectable
我上面提到的方式进行定义,则Person
该类将如下所示:
class Person extends Entity implements EntityNameableSelectable<Person> {}
推荐阅读
- powershell - 当使用 PowerShell 不知道结构时如何迭代 HTTP JSON 响应?
- javascript - 有哪些方法可以减少使用工作线程的 NodeJS 程序的内存使用量?
- django - 如何使用 Mongo 引擎在 Point 字段中存储位置并获取位置附近最近的 5 家餐厅
- c - c TCP中的套接字我如何测试连接?
- macos - macos 上是否有 getcwd() 系统调用之类的东西
- ruby - 如何修复 Mac OS Catalina 10.15.4 上的 RVM 安装错误
- javascript - TypeError:无法读取未定义的属性“allMarkdownRemark”(在页面中)
- swiftui - 图像之间的 SwiftUI 文本未正确对齐
- firebase - 在 Firebase Flutter 上更新数组中的项目
- maven - 如何将基于 java 的注释 maven 项目转换为 Spring Boot?