此代码崩溃:
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
,因此崩溃。为什么不? person
总是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();
}
}
Person
始终是Entity
,EntityNamable
和EntityNameableSelectable
,对吗?仅当
EntityNameableSelectable
扩展EntityNameable
或Person
实现EntityNameable
时。如果您如上所述定义
EntityNameableSelectable
,则Person
类将如下所示:class Person extends Entity implements EntityNameableSelectable<Person> {}