2011-05-16 146 views
3

我正在学习java。我试图运行代码,我得到了这个错误。它说,返回类型是不兼容的。代码 部分,其中原因是什么,它给我的错误Java - 错误:返回类型不兼容

class A { 
      public void eat() { } 
    } 

    class B extends A { 
      public boolean eat() { } 
    } 

回答

8

这是因为我们在具有相同名称但返回类型不同的类中不能有两个方法。

子类不能声明一个具有不同返回类型的超类中已存在方法的名称相同的方法。

但是,子类可以声明与超级类中签名相同的方法。 我们称之为“重写”。

你需要有这个,

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() { } 
} 
2

如果B然后延伸A即可重写方法(如eat),但不能更改其签名。所以,你的B类必须是

class B extends A { 
     public void eat() { } 
} 
2

B extends A应该被解释为B是A.

如果A的方法不返回任何东西,B也应该这样做。

2

当子类中的方法与超类中的方法具有相同的名称和参数(它们的类型,数量和顺序)时,子类中的方法将覆盖超类中的方法。

现在为了覆盖允许子类中方法的返回类型必须符合超类中方法的返回类型。这只有在子类中的方法的返回类型是covariant与超类中方法的返回类型时才有可能。

由于boolean </: void(读取:boolean不是void的子类型),编译器会引发“返回类型不兼容”错误。

0

这既不是重载也不是重写。我们不能重载返回类型,我们不能用不同的返回类型重写(除非它们是Java 1.5的协变返回值)。