Вот пример с помощью нескольких, соединяют интерфейсом с наследованием в 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 {...}
(заметьте, что несколько взаимодействуют через интерфейс, наследование на работе с помощью 'расширяет' ключевое слово),
Вы не можете сделать этого, потому что:
типы A и B являются несовместимыми; оба определяют c (), но с несвязанным типом возврата
Имя было выдумано для описания той ситуации?
Я не уверен, что у него есть конкретное название, или, по крайней мере, оно не очень часто используется. Это «просто» проблема неявного отображения методов интерфейса на методы класса; если бы у вас были перегрузки, которые различаются только типами возврата, тоже не было бы проблем. Итак, все сводится к проблеме сигнатуры / перегрузки / неявного сопоставления методов.
В онлайн-книге «Thinking in Java» для него тоже нет названия. http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001.htm
Замечу, что C # допускает явные реализации интерфейса, которые решают эту проблему.
Я также не знаю конкретного названия этой проблемы. Всякий раз, когда он возникал, он описывался в предложении, содержащем слова несовместимость возвращаемого типа в какой-то момент. Вы также можете назвать это несовместимостью Map / Set , поскольку это один из наиболее ярких и раздражающих примеров в библиотеках классов Java. Это делает невозможным иметь один и тот же класс, реализующий Map, а также Set или Collection только потому, что Map определяет метод remove (Object) с другим типом возвращаемого значения, чем Collection.
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 не могут иметь реализацию метода, проблема в поэтому этого следует избегать, поскольку всегда существует только одна реализация конкретного метода и, следовательно, не возникнет двусмысленности.
Я упустил суть или вы говорите о переменной 'c'?
JLS §6.4.4, Члены типа интерфейса называет такие повторяющиеся элементы суперинтерфейса неоднозначными и требует ошибки времени компиляции. Я надеялся на что-нибудь красочное, такое как Эффект Божоле , Гейзенбуг , и др. . Может быть двое людей ?
Я бы не стал называть это проблемой множественного наследования, потому что интерфейсы просто хорошо описывают интерфейс - набор методов, которые должен определять реализующий класс, - а не какую-либо реализацию. Расширение интерфейса с помощью других интерфейсов на самом деле не означает, что субинтерфейс наследуется от суперинтерфейса, а скорее, что субинтерфейс является, по сути, конкатенацией методов, определенных в этих двух.
Если третий интерфейс используется для расширения подынтерфейса и предоставляет объявление конфликтующего метода, это по сути то же самое, как если бы вы только что предоставили те же два конфликтующих метода в одном интерфейсе.
Я не помню, видел ли я когда-нибудь какое-нибудь название для этого. В Спецификации языка Java для этого тоже нет названия.