19

可能重复:
接口实现中的方法名称冲突 - Java

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

interface A {
    public int foo();
}

interface B {
    public double foo();
}

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

有没有简单的方法来克服这个问题?

4

6 回答 6

13

最简单的解决方案是始终返回doubleA,因为它可以存储所有可能的int值。

如果您不是一个选项,则需要使用继承的替代方法。

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

C c = new C();
int a = c.getA().foo();
double b = c.getB().foo();
于 2012-10-08T13:15:04.630 回答
12

你不能。Java 通过名称和参数而不是返回类型来唯一标识方法。

于 2012-10-08T13:14:49.877 回答
4

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

示例实现:

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(){...}
}
于 2012-10-08T13:27:33.933 回答
3

在接口 A 和 B 中使用 Number 代替 double 和 int。

于 2012-10-08T13:16:38.257 回答
3

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

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

于 2012-10-08T13:16:45.807 回答
2

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

于 2012-10-08T13:15:50.020 回答