Java:你怎么称这种多重inheritance歧义?

这是在Java中使用多接口inheritance的示例,这是一个问题。

请注意,我完全知道为什么会出现问题,这不是我的问题。 问题是关于如何命名这个特定的多接口inheritance歧义,如果它有一个名称。

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

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

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

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

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

interface A { void a(); Integer c(); } interface B { void b(); Long c(); } interface MI extends A, B {...} 

(使用’extends’关键字注意工作中的多个接口inheritance)

你做不到,因为:

A型和B型不兼容; 两者都定义c()但具有不相关的返回类型

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

我不确定它是否有特定的名称,或者至少它似乎并不常用。 它只是“接口”方法隐式映射到类方法的问题; 如果你可能只有返回类型不同的重载,那么也没有问题。 所以它归结为签名/重载/隐式方法映射问题。

在“Thinking in Java”在线书籍中,也没有名称。 http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001.htm

只是旁注,C#允许显式接口实现,解决了这个问题。

JLS§6.4.4,接口类型的成员称这样的重复超接口成员不明确 ,并且需要编译时错误。 我希望有一些丰富多彩的东西,如Beaujolais Effect , Heisenbug 等 。 也许是两个人群

我也不知道这个问题的具体名称。 每当它出现时,它在一个句子中描述,其中包含某些点上的返回类型不兼容 。 您也可以将其称为Map / Set不兼容,因为这是Java类库中更突出和烦人的示例之一。 它使得无法使用相同的类实现Map以及Set或Collection,因为Map定义了一个与Collection不同的返回类型的remove(Object)方法。

 public interface Collection extends Iterable { boolean remove(Object o); } public interface Set extends Collection { } public interface Map { V remove(Object key); } 

我不愿意将此称为多inheritance问题,因为接口只是描述得很好,接口 – 实现类必须定义的一组方法 – 而不是任何实现。 扩展与其他接口的接口并不意味着子接口inheritance自超接口,而是子接口本质上是两者中定义的方法的串联。

如果使用第三个接口来扩展子接口并提供冲突的方法声明,那么它基本上就像您在同一个接口中提供了相同的两个冲突方法一样。

我不记得我是否见过这个名字。 在Java语言规范中 ,也没有这个名称。

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

如果接口inheritance了具有冲突成员的两个接口,则实现复合接口的类可以实现成员,就像它直接inheritance了冲突接口一样。 组合接口的消费者通常无法使用任一组件接口的成员而无需将引用转换为其他接口类型之一,但有问题的转换将被视为向上而不是向下转换。

在.NET中实现的方案在那里很好用。 不幸的是,在Java中没有办法做类似的事情。 我不知道如果一个接口inheritance了具有冲突成员的其他接口,Java会发出尖叫声,但是不管它是否在那个时候发出声响,就没有办法产生一个可以实现它的类。

我不认为已经定义了名称,因为Java中的接口不能具有方法实现,因此避免了问题,因为对于特定方法总是只有一个实现,因此不会出现歧义。

我是否错过了这一点,还是在谈论’c’变量?