Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的冲突接口方法_Java_Interface_Overriding - Fatal编程技术网

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代码中是非法的,但在字节码中是合法的。