以下是我的情景:
public interface Father{ public void sayHi(); }
public abstract class FatherImpl implements Father{
@Override
public void sayHi() { System.out.print("Hi"); } }
然后是孩子
public interface Child{}
public class ChildImpl extends FatherImpl implements Child{}
和测试功能是
Child c = new ChildImpl();
c.sayHi();
这会抛出编译错误。 仅当我将子界面更改为
时public interface Child{} extends Father
然后程序正常运行。
任何人都可以帮我解释原因。
答案 0 :(得分:3)
Child c = new ChildImpl();
Child
界面没有sayHi()
方法,ChildImpl
。您将c
引用为Child
对象,因此您无法访问该方法。
您可以将对象引用为ChildImpl
或添加另一个类。
ChildImpl c = new ChildImpl();
或者
public abstract class TalkingChild {
@Override
public void sayHi() {
System.out.print("Hi");
}
}
或者
public interface TalkingChild {
public void sayHi();
}
最佳解决方案完全取决于您的具体情况。
答案 1 :(得分:2)
问题是编译器只关心声明的类型 - 分配的类型是无关紧要的。
将此应用于您的案例,类型Child
没有方法。它并不认为您为ChildImpl
变量分配了sayHi()
,其中 具有Child
方法。