EntityNameableSelectable

EntityNameableSelectable

此代码崩溃:

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总是EntityEntityNamableEntityNameableSelectable对吗?

我还想知道为什么我需要将其强制转换为EntityNameable来调用方法getSomething,因为每个实现类都应具有该方法。为什么需要演员表?它与崩溃有关系...

最佳答案

我还想知道为什么我需要将其强制转换为EntityNameable才能调用方法getSomething,因为每个实现类都应具有该方法。


EntityNameableSelectable不是EntityNameableEntityNameableSelectable不会扩展该接口,因此不会继承任何方法。

可能是您希望EntityNameableSelectable扩展EntityNameable,所以您可以调用getSomething()

interface EntityNameableSelectable<T extends Entity> extends EntityNameable<T> {
    default String selectMe() {
        return getSomething();
    }
}



  Person始终是EntityEntityNamableEntityNameableSelectable,对吗?


仅当EntityNameableSelectable扩展EntityNameablePerson实现EntityNameable时。

如果您如上所述定义EntityNameableSelectable,则Person类将如下所示:

class Person extends Entity implements EntityNameableSelectable<Person> {}

10-05 18:35