Tag: 钻石问题

为什么带有共同祖先的钻石案例用于解释Java多重inheritance问题,而不是两个不相关的父类?

对于Java人来说,这个问题可能听起来很奇怪,但如果你试图解释这个问题,那就太好了。 在这些日子里,我正在清除Java的一些非常基本的概念。 所以我来谈谈Java的inheritance和接口主题。 在阅读本文时,我发现Java不支持多重inheritance,并且也明白,我无法理解为什么到处钻石图形问题(至少4个类创建钻石)被讨论来解释这种行为,我们不能仅使用3个类来理解此问题。 说,我有A类和B类,这两个类是不同的(它们不是普通类的子类)但是它们有一个共同的方法,它们看起来像: – class A { void add(int a, int b) { } } class B { void add(int a, int b) { } } 好的,现在说如果Java支持多重inheritance,并且如果有一个类是A和B的子类,如下所示: – class C extends A,B{ //If this was possible @Override void add(int a, int b) { // TODO Auto-generated method stub super.add(a, b); //Which version of […]

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()但具有不相关的返回类型 有没有一个名字来描述这种情况?

如何在Java中实现与单应性方法的接口?

在英语中,同形异义词对是两个具有相同拼写但含义不同的单词。 在软件工程中,一对同形方法是两种具有相同名称但要求不同的方法。 让我们看一个人为的例子,让问题尽可能清晰: interface I1 { /** return 1 */ int f() } interface I2 { /** return 2*/ int f() } interface I12 extends I1, I2 {} 我该如何实施I12 ? C# 有办法做到这一点,但Java没有。 所以唯一的方法是破解。 怎样才能最可靠地完成reflection/字节码技巧/等等(即它不一定是一个完美的解决方案,我只想要一个效果最好的解决方案)? 请注意,我不能合法地逆向工程的一些现有的闭源大量遗留代码需要I12类型的参数,并将I12委托给具有I1作为参数的代码,以及将I2作为参数的代码。 所以基本上我需要创建一个I12的实例,知道它何时应该充当I1 ,何时它应该充当I2 ,我相信可以通过在直接调用者的运行时查看字节码来完成。 我们可以假设调用者没有使用reflection,因为这是简单的代码。 问题是I12的作者没想到Java会从两个接口合并f ,所以现在我必须想出最好的解决问题的方法。 没有什么能调用I12.f (显然如果作者写了一些实际上叫做I12.f代码,他会在出售之前注意到这个问题)。 请注意,我实际上是在寻找这个问题的答案,而不是如何重构我无法改变的代码。 我正在寻找最好的启发式方法,或者如果存在的话,可以找到精确的解决方案。 请参阅Gray的答案以获得有效示例(我确信有更强大的解决方案)。 这是一个具体的例子,说明两个接口内的单应方法问题是如何发生的。 这是另一个具体的例子: 我有以下6个简单的类/接口。 它类似于剧院周围的商业和在其中表演的艺术家。 为了简单起见,我们假设它们都是由不同的人创建的。 Set代表一个集合,如集合论: interface Set { […]

三合会没有出现在战斗中? (Java设置缺少一个项目)

我有来自两家公司asoft和bsoft的代码。 我也无法改变。 这是我的情况的简化版本,我非常确定有足够的信息来查找导致问题的原因。 bsoft提供IGang ,代表一个可以与其他帮派作战的团伙。 package bsoft; public interface IGang { /** @return negative, 0, or positive, respectively * if this gang is weaker than, equal to, or stronger * than the other */ public int compareTo(IGang g); public int getStrength(); public String getName(); public void attack(IGang g); public void weaken(int amount); } asoft提供GangWar ,允许IGang进行战斗: […]

即将发布的Java 8版本中的虚拟扩展方法

当我看到代码片段之类的时候 interface A { void a(); void b() default { System.out.println(“b”); }; void c() final { System.out.println(“c”); }; } 我有一个问题。 我们还没有得到足够的Java? 为什么人们可能需要这个?

java中的多重inheritance

Java不允许从多个类inheritance(仍允许从多个接口inheritance。),我知道它非常符合经典的钻石问题。 但是我的问题是,当从多个基类inheritance时没有歧义(因此没有钻石问题的机会)时,java不允许像C ++这样的多重inheritance?