Java - 两个接口中的双重定义

时间:2011-06-09 13:28:01

标签: java

A类可以实现多个接口。

我不明白在这种情况下会发生什么:

public interface example1 {
    void checkInt(int a);
}

public interface example2 {
    void checkInt(int b);
}

public class class1 implements example1,example2 {
    void checkInt(int c){
        System.out.print(c);
    }
    this.checkint(5);
}

我试图运行它,它给了我编译错误。但我的问题一般是,我可以实现两个具有相同签名功能的接口吗?

6 个答案:

答案 0 :(得分:3)

你得到的编辑错误是什么?由于this.checkint出现错误,因此应为checkInt(5)?此外,您将方法的范围从隐含的公共(如所有接口方法)减少到默认(打包保护)。 checkInt方法需要在实现类中公开。

两个接口都定义了方法,但这很好,因为class1上有一个实现。所以class1通过checkInt(int i)的实现来实现每个接口的实现方法。使用接口只需要履行合同,因此对于调用哪种方法没有任何歧义 - 如果使用类型为example1example2的引用,它仍然是相同的checkInt class1上被调用的方法。

答案 1 :(得分:2)

编译错误是因为您在方法checkInt的实现类中缺少可见性属性(public),并且您有一个未被任何方法包含的语句。

但是一般来说,如果你有一个实现多个具有公共方法签名的接口的类,那么该类只有一个实现来满足这两个接口。

答案 2 :(得分:1)

我很确定您的编译错误来自this.checkint(5)行,而不是接口实现。实现两个共享具有相同签名的方法的接口是完全合法的,您已经完成了上述操作。

您可以这样想:当一个类实现一个接口时,它同意实现该接口定义的所有方法。只要您已满足每个接口的此要求,您实际编写的方法数量无关紧要。

另外,请考虑如何实际使用接口:

example1 e1 = new class1();
e1.checkInt(3); // Calls class1.checkInt()

example2 e2 = new class1();
e2.checkInt(3); // Also calls class.checkInt()

接口变量实际上是指类型为class1的对象,因此class1的方法很重要,而不是class1实现的其他接口。

答案 3 :(得分:0)

您不继承接口,而是实现它。实现界面的方法是通知您班级的消费者您保证可以使用某组方法。许多接口在合同中可以有单个方法签名,但由于只有实现类具有实际代码,因此没有问题。

答案 4 :(得分:0)

是的,您可以实现这两个接口。但是,通常不建议这样做,因为它可能会导致您所说的混乱。

您只能在参数,名称和返回类型完全匹配的特定情况下实现两个接口,否则会发生冲突。如果名称或参数类型不同,则需要单独实现。如果所有不同的是返回类型,那么在它们发生冲突时就不可能实现这两个接口。

如果两个接口恰好具有该方法的不同含义,那么您最好提供适配器。请参阅Adapter pattern

A whole article on solving this problem has been written here

您的编译错误是由于其他原因(在这种情况下,您尚未声明您的实现方法public),并查看您提供的代码示例,可能还有很多其他内容!

答案 5 :(得分:0)

来自接口的类inherit

Classes inherit Classes
Interfaces inherit interfaces
Classes `implements` Interfaces

你的例子非常好,因为Interface只声明了签名(或契约),没有定义行为。类'实现'接口以提供行为。因此,实现两个接口的类可以为这两个方法提供“相同”的实现 - 合同不会像类is那样消除行为。