Java中的冲突接口方法

时间:2012-10-08 13:11:49

标签: java interface override

  

可能重复:
  Method name collision in interface implementation - Java

如果我们需要实现两个接口,包含一个具有相同名称和参数但具有不同返回类型的方法,我们该怎么办?例如:

interface A {
    public int foo();
}

interface B {
    public double foo();
}

class C implements A, B {
    public int foo() {...}  // compilation error
}

有没有一种简单的方法可以解决这个问题?

6 个答案:

答案 0 :(得分:13)

最简单的解决方案是始终在A中返回double,因为它可以存储每个可能的int值。

如果您不是选项,则需要使用替代继承。

class C {
    public A getA();
    public B getB();
}

C c = new C();
int a = c.getA().foo();
double b = c.getB().foo();

答案 1 :(得分:12)

你不能。 Java通过名称及其参数唯一地标识方法,而不是它们的返回类型。

答案 2 :(得分:4)

您可以编写Adapter类来实现其中一个接口。

示例实施:

class AdapterA implements A{
     AdapterA(C c){impl = c;}
     private final C impl;
     public int foo(){return c.fooReturningInt();}
}
class C implements B{

   public double foo(){...}
   public int fooReturningInt(){...}
}

答案 3 :(得分:3)

在接口A和B中使用Number而不是double和int。

答案 4 :(得分:3)

Java中的方法由其签名唯一定义。来自http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

  

定义:方法声明的两个组成部分包括方法签名 - 方法的名称和参数类型。

答案 5 :(得分:2)

您的foo()方法显然没有明确定义。可能应该有一个带有public Number foo()的父接口,它由A和B扩展,并将其覆盖为更具体的类型。除非您重命名其中一个foo方法,否则您的类实际上没有一种合理的方法可以实现这两种接口。