可能重复:
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
}
有没有一种简单的方法可以解决这个问题?
答案 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)
答案 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
方法,否则您的类实际上没有一种合理的方法可以实现这两种接口。