Java中的冲突接口方法
可能重复:Java中的冲突接口方法,java,interface,overriding,Java,Interface,Overriding,可能重复: 如果我们需要实现两个接口,这两个接口都包含一个名称和参数相同但返回类型不同的方法,我们该怎么办?例如: interface A { public int foo(); } interface B { public double foo(); } class C implements A, B { public int foo() {...} // compilation error } 有没有一种简单的方法可以克服这个问题?你不能。Java通过名称和
如果我们需要实现两个接口,这两个接口都包含一个名称和参数相同但返回类型不同的方法,我们该怎么办?例如:
interface A {
public int foo();
}
interface B {
public double foo();
}
class C implements A, B {
public int foo() {...} // compilation error
}
有没有一种简单的方法可以克服这个问题?你不能。Java通过名称和参数,而不是返回类型来唯一地标识方法。最简单的解决方案是始终以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();
您的
foo()
方法显然没有得到很好的定义。很可能应该有一个带有公共编号foo()
的父接口,该接口由a和B扩展,并将其覆盖到更特定的类型。除非重命名其中一个foo
方法,否则类实际上没有一种合理的方法可以实现这两个接口。在接口a和B中使用Number而不是double和int。Java中的方法是由其签名唯一定义的。从
定义:方法声明的两个组件包括方法签名、方法名称和参数类型
您可以编写一个类来实现其中一个接口
实施示例:
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(){...}
}
为什么一开始会有两个这样的接口??或者您是从其他地方获得它的?使用
Facade
模式来封装对一个同名方法的调用?因为不能在一个类中声明两个名称相同的方法(即使使用diffirent返回类型),如果返回类型是对象(any)和int怎么办?我们不能做同样的事情。简单地返回双倍不能解决问题。。。仍然会有编译器错误。您还需要更改A中的foo()
的返回类型(如果A是以前存在的接口,这可能不可能)。您提出的另一个解决方案可能更好。@NandkumarTekale您必须为这两种方法找到一个超级类型。或者使用第二种方法。另一个想法:使用数字而不是双精度。这是重写或重载的规则之一。实际上,相同的名称和具有不同返回类型的参数在java代码中是非法的,但在字节码中是合法的。