我正在学习java。我试图运行代码,我收到此错误:return type is incompatible
。
代码中显示错误的部分代码。
class A {
public void eat() { }
}
class B extends A {
public boolean eat() { }
}
为什么会这样?
答案 0 :(得分:9)
这是因为我们不能在具有相同名称但返回类型不同的类中使用两个方法。
子类不能使用不同的返回类型声明具有与超类中已存在方法相同名称的方法。
但是,子类可以声明一个方法,其签名与超类中的签名相同。 我们称之为“覆盖”。
你需要这个,
class A {
public void eat() { }
}
class B extends A {
public void eat() { }
}
OR
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() { }
}
答案 1 :(得分:2)
如果B
扩展A
,那么您可以覆盖方法(例如eat
),但您无法更改其签名。因此,您的B
课程必须
class B extends A {
public void eat() { }
}
答案 2 :(得分:2)
B extends A
应解释为B是A。
如果A的方法没有返回任何内容,B应该这样做。
答案 3 :(得分:2)
当子类中的方法与超类中的方法具有相同的名称和参数(它们的类型,编号和顺序)时,子类中的方法将覆盖超类中的方法。
现在为了允许覆盖,子类中方法的返回类型必须符合超类中方法的返回类型。只有当子类中方法的返回类型与超类中的方法的返回类型协变时,才可能这样做。
因为boolean </: void
(读:boolean
不是void
的子类型),编译器会引发“返回类型不兼容”错误。
答案 4 :(得分:0)
这既不是超载也不是覆盖。我们不能在返回类型上重载,并且我们不能使用不同的不同返回类型覆盖(除非它们是协变的返回,我们是Java 1.5)。