在其他默认方法中从其他接口调用默认方法

时间:2018-09-27 12:21:40

标签: java inheritance interface java-8 default-method

此代码崩溃:

#include<stdio.h>

int main()
{
    int i=0;
    char a[6];
    for(i=0;i<6;i++)
    {
        printf("%d-)Enter a character : ",i+1); scanf("%s",&a[i]);
    }
    for(i=0;i<6;i++)
    {
        printf("Value of %d. element in Array : %c\n",i+1,a[i]);
    }

    return 1903; //Beşiktaş Football Club was founded in 1903 :)
}

可以通过将其粘贴到https://www.jdoodle.com/online-java-compiler

中来执行此代码。
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 {

}

它崩溃是因为无法将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始终是personEntityEntityNamable对吗?

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

2 个答案:

答案 0 :(得分:2)

  

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

new_list = [if ??? y for x in nested_list for y in x] 不是EntityNameableSelectableEntityNameable不会扩展该接口,因此不会继承任何方法。

可能您希望EntityNameableSelectable扩展EntityNameableSelectable,因此您可以呼叫EntityNameable

getSomething()
  

interface EntityNameableSelectable<T extends Entity> extends EntityNameable<T> { default String selectMe() { return getSomething(); } } 始终是PersonEntityEntityNamable,对吧?

仅当EntityNameableSelectable扩展了EntityNameableSelectableEntityNameable实现Person时。

如果您如上所述定义EntityNameable,则EntityNameableSelectable类如下:

Person

答案 1 :(得分:2)

  

Person始终是EntityEntityNamableEntityNameableSelectable对吗?

Person扩展了Entity并实现了EntityNameableSelectable,但没有实现EntityNameable,不。

我不确定您到底想做什么,但是我怀疑<T extends EntityNameable>没有按照您的意愿去做。尝试让EntityNameableSelectable扩展EntityNameable

interface EntityNameableSelectable extends EntityNameable {
  default String selectMe() { 
    return getSomething();
  } 
}

类似地,使EntityNameable具有通用的T参数也不正确。在示例代码T中没有执行任何操作,因此您可以将其删除。

interface EntityNameable {
  default String getSomething() {
    return "";
  } 
}