使用接口和抽象类编译错误

时间:2013-10-14 08:01:15

标签: java

我有一个接口和一个抽象类:

interface MyInterface {int presents();};

public abstract class MyAbstractClass implements MyInterface {
    abstract void presents();
    abstract void chill();
}

编译器在

中抱怨
abstract void presents();

返回类型与

不兼容
MyInterface.presents()

提供以下选项:

make it int type
make MyInterface.presents void type

为什么会这样?

3 个答案:

答案 0 :(得分:8)

您定义了在presents()界面中返回int的方法Gift。 然后,您尝试在名为presents()的类中重新定义返回类型为void的方法myClass

很明显int不是void。这意味着返回类型不兼容。

您对方法继承感到困惑。问题是java(和所有类c语言)的语法没有规定返回值的使用,所以即使你的方法返回int,你仍然可以像下面这样调用它:

presents();

因此,假设编译器允许您有两个名为presents()的不同方法:一个返回int,另一个返回void。编译器如何理解我们的示例中使用哪种方法?答案是没办法的。这就是您可以使用不同的参数签名覆盖方法的原因,例如

presents();
presents(String str);
presents(int n);

但是,您不能拥有2个具有相同参数签名和不同返回类型的方法。

答案 1 :(得分:4)

在界面中,presents被定义为返回int,但在您声明要实现界面的类中,它是void。两者需要匹配。

答案 2 :(得分:3)

因为接口具有方法presents(),并且您正尝试在此处更改方法签名。

如果您不希望该方法编写新方法。

 abstract void anotherPresents();

满足原始签名

   abstract int presents();