Java: как Вы называете эту неоднозначность множественного наследования?

Вот пример с помощью нескольких, соединяют интерфейсом с наследованием в 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 (), но с несвязанным типом возврата

Имя было выдумано для описания той ситуации?

9
задан SyntaxT3rr0r 14 February 2010 в 07:13
поделиться

6 ответов

Я не уверен, что у него есть конкретное название, или, по крайней мере, оно не очень часто используется. Это «просто» проблема неявного отображения методов интерфейса на методы класса; если бы у вас были перегрузки, которые различаются только типами возврата, тоже не было бы проблем. Итак, все сводится к проблеме сигнатуры / перегрузки / неявного сопоставления методов.

В онлайн-книге «Thinking in Java» для него тоже нет названия. http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001.htm

Замечу, что C # допускает явные реализации интерфейса, которые решают эту проблему.

3
ответ дан 3 November 2019 в 03:47
поделиться

Я также не знаю конкретного названия этой проблемы. Всякий раз, когда он возникал, он описывался в предложении, содержащем слова несовместимость возвращаемого типа в какой-то момент. Вы также можете назвать это несовместимостью 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);
}
2
ответ дан 3 November 2019 в 03:47
поделиться

Я не думаю, что имя было определено, потому что интерфейсы в Java не могут иметь реализацию метода, проблема в поэтому этого следует избегать, поскольку всегда существует только одна реализация конкретного метода и, следовательно, не возникнет двусмысленности.

Я упустил суть или вы говорите о переменной 'c'?

-2
ответ дан 3 November 2019 в 03:47
поделиться

JLS §6.4.4, Члены типа интерфейса называет такие повторяющиеся элементы суперинтерфейса неоднозначными и требует ошибки времени компиляции. Я надеялся на что-нибудь красочное, такое как Эффект Божоле , Гейзенбуг , и др. . Может быть двое людей ?

3
ответ дан 3 November 2019 в 03:47
поделиться

Я бы не стал называть это проблемой множественного наследования, потому что интерфейсы просто хорошо описывают интерфейс - набор методов, которые должен определять реализующий класс, - а не какую-либо реализацию. Расширение интерфейса с помощью других интерфейсов на самом деле не означает, что субинтерфейс наследуется от суперинтерфейса, а скорее, что субинтерфейс является, по сути, конкатенацией методов, определенных в этих двух.

Если третий интерфейс используется для расширения подынтерфейса и предоставляет объявление конфликтующего метода, это по сути то же самое, как если бы вы только что предоставили те же два конфликтующих метода в одном интерфейсе.

1
ответ дан 3 November 2019 в 03:47
поделиться

Я не помню, видел ли я когда-нибудь какое-нибудь название для этого. В Спецификации языка Java для этого тоже нет названия.

1
ответ дан 3 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: