这是一个在 Java 中使用多接口继承的示例,但存在一个问题。

请注意,我完全知道为什么会出现问题,但这不是我问题的重点。问题是如何命名这个特定的多接口继承歧义(如果有一个名称的话)。

例如,在 C++ 中,当您使用多个实现继承并且无法确定要使用哪个重写方法时出现的歧义称为“钻石问题”:

http://en.wikipedia.org/wiki/Diamond_problem

现在,我再次知道这不是同一个问题:这不是重点。关键是在之前的案例中已经创造了一个名字。

我想知道我将要描述的问题是否存在一个名称。

下面是另一种多重继承的示例,其中一个接口继承自具有不兼容方法返回类型的其他两个接口:

interface A {
  void a();
  Integer c();
}

interface B {
  void b();
  Long c();
}

interface MI extends A, B {...}

(注意使用“extends”关键字进行多接口继承)

你不能这样做,因为:

A型和B型不相容;两者都定义C(),但没有相关的返回类型

有没有创造一个名字来描述这种情况?

有帮助吗?

解决方案

我不知道有一个特定的名称,或至少它似乎并没有被广泛使用。这是“公正”的接口方法类方法隐映射的问题;如果你能拥有这唯一的返回类型不同的重载,不会有什么问题,或者请。所以它归结为一个签名/过载/隐式方法映射问题。

在“在Java编程思想”在线图书,有没有为它的名称无论是。 http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001。 HTM

仅有侧面说明,C#允许显式接口实现,它解决了这个问题。

其他提示

JLS §6.4.4,接口类型的成员 调用此类重复的超级接口成员 模糊的, ,并且需要一个编译时错误。我希望有一些丰富多彩的东西,比如 博若莱效应, 海森巴格, 等人. 。或许 两人成群?

我也不知道这个问题的任何具体名称。每当它arised它在包含在某一时刻的话返回类型不相容一个句子描述。你也可以把它的地图/设置不相容性,因为这是在Java类库的更为突出和恼人的例子之一。这使得它不可能有相同的类实现Map以及集或集合,只是因为地图限定的除去(对象)方法与不同的返回类型比集合

public interface Collection<E> extends Iterable<E> {
    boolean remove(Object o);
}
public interface Set<E> extends Collection<E> {
}
public interface Map<K,V> {
    V remove(Object key);
}

我会毫不犹豫地称这是一个多重继承的问题,因为仅仅接口以及描述,接口 - 一组方法实现的类必须定义 - 而不是任何实现。延伸与其它接口的接口并不真正意味着从超接口子接口继承,而是子接口是,在本质上,在这两个定义的方法的级联。

如果一个第三接口用于扩展子接口,并提供一个冲突的方法声明,它本质上是一样的,如果你刚提供在同一界面相同的两个冲突的方法。

我不记得我所见过的任何名称用于此。在 Java语言说明书存在用于此没有名字或者

您所描述的问题存在于.NET和Java,但有一个简单的解决方案有:在.NET框架允许类使用类成员用不同的名称来实现接口成员。因此,尽管需要哪些实现两个接口构件,其差异仅在返回类型的类的方法有不同的名称,这不排除它们以实现接口部件具有相同名称的能力。

如果一个接口继承两个接口相互冲突的构件,它实现了复合界面可以实现部件,就好像它已直接继承冲突接口的类。将合并的界面的消费者通常将不能够使用任一组分接口的成员没有参考一个转换为另一个接口类型之一,但是所讨论的广播将被认为是一个上溯造型,而不是垂头丧气。

在.NET实现该方案很好地工作在那里。不幸的是,有没有办法做到在Java中类似的事情。我不知道,如果一个接口继承了冲突的成员其他接口的Java会发牢骚,但它是否叫声,在这一点上,就没有办法产生一类可以实现它。

我不认为一个名字已经被定义,因为Java接口不能有方法实现,问题因此避免了因为永远只有一个实现特定的方法,因此没有歧义会出现。

难道我错了或者是你在谈论“C”变量?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top