首页 > 解决方案 > 在另一个默认方法中从其他接口调用默认方法

问题描述

此代码崩溃:

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始终是EntityEntityNamableEntityNameableSelectable吗?

我也想知道为什么我需要将它转换EntityNameable为调用方法getSomething,因为每个实现类都应该有那个方法。为什么需要演员表?它必须与崩溃有关...

标签: javainheritanceinterfacejava-8default-method

解决方案


我也想知道为什么我需要将它转换为 EntityNameable 来调用方法 getSomething,因为每个实现类都应该有那个方法。

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

可能,您想EntityNameableSelectable扩展EntityNameable,因此您可以调用getSomething().

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

APerson总是Entity,EntityNamableEntityNameableSelectable, 对吧?

仅当EntityNameableSelectableextendsEntityNameablePersonimplements EntityNameable

如果您按照EntityNameableSelectable我上面提到的方式进行定义,则Person该类将如下所示:

class Person extends Entity implements EntityNameableSelectable<Person> {}

推荐阅读