簡體   English   中英

Java:你怎么稱這種多重繼承模糊?

[英]Java: how do you call this multiple inheritance ambiguity?

這是在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()但具有不相關的返回類型

有沒有一個名字來描述這種情況?

我不確定它是否有特定的名稱,或者至少它似乎並不常用。 它只是“接口方法”隱式映射到類方法的問題; 如果你可能只有返回類型不同的重載,那么也沒有問題。 因此,它歸結為簽名/重載/隱式方法映射問題。

在“Thinking in Java”在線書籍中,也沒有名稱。 http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001.htm

只是旁注,C#允許顯式接口實現,解決了這個問題。

JLS§6.4.4,接口類型的成員調用此類重復的超級接口成員不明確 ,並且需要編譯時錯誤。 我希望有一些豐富多彩的東西,比如Beaujolais EffectHeisenbug 也許是兩個人群

我也不知道這個問題的具體名稱。 每當它出現時,它在一個句子中描述,其中包含在某些時候返回類型不兼容的單詞。 您也可以將其稱為Map / Set不兼容,因為這是Java類庫中更為突出和煩人的示例之一。 它使得無法使用相同的類實現Map以及Set或Collection,因為Map定義了一個與Collection不同的返回類型的remove(Object)方法。

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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM