假设我有两个接口A和接口B:
public interface A {
public int data();
}
public interface B {
public char data();
}
接口A有方法public int data()
,接口B有方法public char data()
。
当我在某个C类中实现接口A和B时,编译器给出了一个错误。这是java中的一个缺陷吗?我认为这是我们不允许扩展多个类的主要原因之一,那么当这个问题仍然存在时,为什么我们允许实现多个接口呢?
答案 0 :(得分:7)
The Java Tutorials: Defining Methods - Overloading Methods州,
Java编程语言支持重载方法和Java 可以区分具有不同方法签名的方法。这个 表示类中的方法具有相同的名称 不同的参数列表。
也
您不能声明多个具有相同名称和方法的方法 相同数量和类型的参数,因为编译器无法分辨 他们分开了。
编译器在区分时不考虑返回类型 方法,因此您不能声明具有相同签名的两个方法 即使他们有不同的回报类型。
两个实现的方法共享一个共同的方法签名(即data()
),因此,编译器无法区分这两个方法,并且将使单个方法满足两个接口契约。 / p>
例如,
public class Foo implements IFoo, IBar{
public static void main(String[] args) {
Foo foo = new Foo();
((IFoo) foo).print();
((IBar) foo).print();
}
@Override
public void print() {
System.out.println("Hello, World!");
}
}
public interface IBar {
void print();
}
public interface IFoo {
void print();
}
将输出,
Hello, World!
Hello, World!
答案 1 :(得分:4)
Java编译器(我认为也是C#)不会根据返回值区分方法。在您的情况下,尽管返回类型
不同,但编译器认为这两种方法都是相同的答案 2 :(得分:2)
您提出的问题与多重继承无关。实现多个接口的类实现也不是。
定义接口时,您只是说该接口的实现者应该同意合同并实现该接口上定义的所有方法。
一个类实现可以实现多个接口而没有问题,但是接口不能冲突。在您的情况中,您试图实现两个声明具有相同签名的方法的接口。
方法签名由java中的名称和参数类型组成。
定义:方法声明的两个组成部分包括 方法签名 - 方法的名称和参数类型。
http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
为了使方法过载,您需要使用不同的签名。
不允许使用Java中的多重继承,因为存在复杂的问题,例如定义当方法由两个或多个超类实现时应该执行哪个实现。对于此主题,我建议您查看Diamond Problem
事实上,接口在某些情况下用于模拟多重继承,允许类呈现一组合并的方法。
答案 3 :(得分:0)
一种解决方案是使用内部类:
您的“C类”实现了界面“A”
您还有一个实现接口“C”的内部类“D”:
公共类C实现A { ... 私人类D实现B {
如果你真的需要同一个类中的两个接口,这可能会让你吃蛋糕并吃掉它:)