【问题标题】:Java - Error : return type is incompatibleJava - 错误:返回类型不兼容
【发布时间】:2011-08-26 06:46:28
【问题描述】:
我正在学习java。我试图运行代码,但出现此错误:return type is incompatible。
显示错误的部分代码。
class A {
public void eat() { }
}
class B extends A {
public boolean eat() { }
}
为什么会这样?
【问题讨论】:
标签:
java
inheritance
overriding
return-type
【解决方案1】:
这是因为我们不能在具有相同名称但返回类型不同的类中拥有两个方法。
子类不能以不同的返回类型声明与父类中已经存在的方法同名的方法。
但是,子类可以声明与超类具有相同签名的方法。
我们称之为“覆盖”。
你需要这个,
class A {
public void eat() { }
}
class B extends A {
public void eat() { }
}
或
class A {
public boolean eat() {
// return something...
}
}
class B extends A {
public boolean eat() {
// return something...
}
}
一个好的做法是通过注解@Override标记被覆盖的方法:
class A {
public void eat() { }
}
class B extends A {
@Override
public void eat() { }
}
【解决方案2】:
如果B 扩展A 那么您可以覆盖方法(如eat),但您不能更改它们的签名。所以,你的B 类必须是
class B extends A {
public void eat() { }
}
【解决方案3】:
B extends A 应该被解释为 B 是 A。
如果 A 的方法没有返回任何内容,B 也应该这样做。
【解决方案4】:
当子类中的方法与超类中的方法具有相同的名称和参数(它们的类型、编号和顺序)时,子类中的方法将覆盖超类中的方法。
现在要允许覆盖,子类中方法的返回类型必须符合超类中方法的返回类型。仅当子类中方法的返回类型与超类中方法的返回类型协变时,这是可能的。
由于boolean </: void(阅读:boolean 不是void 的子类型),编译器会引发“返回类型不兼容”错误。
【解决方案5】:
这既不是重载也不是覆盖。我们不能重载返回类型,也不能用不同的返回类型覆盖(除非它们是 Java 1.5 的协变返回)。