Являются ли значения по умолчанию в JDK 8 формой множественного наследования в Java?

Новая функция, появившаяся в JDK 8, позволяет добавлять к существующему интерфейсу, сохраняя двоичную совместимость.

Синтаксис похож на

public interface SomeInterface() {
  void existingInterface();
  void newInterface() default SomeClass.defaultImplementation;
}

Таким образом, для всех существующих реализаций SomeInterface, когда они обновляются до этой новой версии, у них не все вдруг возникают ошибки компиляции вокруг ---- +: = 2 =:. + ----

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

newInterface()

Это уже определено как часть JDK 8?

Я обнаружил, что боги Java говорят о чем-то подобном здесь http: //cs.oswego.edu/pipermail/lambda-lib/2011-Feb февраля/000068.html , но это часть личного списка рассылки, и я не могу задать их напрямую.

Смотрите это для более подробной информации о том, как по умолчанию будут использоваться в JDK 8 и расширении интерфейса Collection для поддержки лямбда-выражений: https://oracleus.wingateweb.com/published/oracleus2011/sessions/25066 /25066_Cho223662.pdf

75 голосов | спросил Pyrolistical 22 +04002011-10-22T10:25:43+04:00312011bEurope/MoscowSat, 22 Oct 2011 10:25:43 +0400 2011, 10:25:43

9 ответов


0

Видеосеанс для просмотра можно посмотреть здесь http://medianetwork.oracle.com/video/player/1113272518001 Это дизайнер говорит о функции под названием Virtual Extensions. Он также говорит о том, что это не нарушает обратную совместимость.

ответил Peter Lawrey 22 +04002011-10-22T11:35:23+04:00312011bEurope/MoscowSat, 22 Oct 2011 11:35:23 +0400 2011, 11:35:23
0

Ответ на дублирующую операцию:

  

Чтобы решить проблему множественного наследования, класс, реализующий два интерфейса, обеспечивающий реализацию по умолчанию для одного и того же имени метода и сигнатуры, должен обеспечить реализацию метода. [Полная статья]

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

ответил H-Man2 22 +04002011-10-22T10:42:10+04:00312011bEurope/MoscowSat, 22 Oct 2011 10:42:10 +0400 2011, 10:42:10
0

Я знаю, что это старый пост, но, поскольку я работаю с этим материалом ...

У вас будет ошибка от компилятора, сообщающая, что:

  

 класс TimeTravelingStudent наследует несвязанные значения по умолчанию для present () от типов Attendance и Timeline   ссылка на настоящее неоднозначна, и метод present () на временной шкале, и метод present () в соответствии с посещаемостью.

ответил Enkk 15 AM00000080000004731 2013, 08:28:47
0
  

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

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

ответил OlliP 26 J000000Thursday12 2012, 12:09:45
0

Короче говоря: это ошибка времени компиляции, необходимо переопределить метод вручную в реализации.


Назначение метода по умолчанию

Основная цель введения метода по умолчанию в Java 8 - сделать интерфейс расширяемым, не нарушая существующие реализации (существует так много сторонних библиотек Java).

И multiple inheritance, как в C ++, на самом деле нужно избегать, это определенно не цель метода по умолчанию в Java.


Как переопределить

2 варианта:

  • Переопределите метод своей собственной логикой.
  • Переопределите метод, вызовите один из методов интерфейса через super, формат: <interface_name>.super.<method_name>();

Советов:

    Метод
  • из интерфейса по умолчанию является общедоступным, поэтому не забудьте добавить ключевое слово public при его переопределении.
ответил Eric Wang 19 J000000Tuesday16 2016, 08:08:13
0

Существует два сценария:

1) Во-первых, это было упомянуто, когда нет наиболее специфичного интерфейса

public interface A {
   default void doStuff(){ /* implementation */ }
}

public interface B {
   default void doStuff() { /* implementation */ } 
}

public class C implements A, B {
// option 1: own implementation
// OR
// option 2: use new syntax to call specific interface or face compilation error
  void doStuff(){
      B.super.doStuff();
  }
}

2) Во-вторых, когда есть более специфический интерфейс:

   public interface A {
       default void doStuff() { /* implementation */ } 
    }

    public interface B extends A {
       default void doStuff() { /* implementation */ } 
    }

    public class C implements A, B {
    // will use method from B, as it is "closer" to C
    }
ответил Andrejs 11 Maypm17 2017, 22:34:15
0

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

ответил studytrails 4 AM000000100000002331 2014, 10:46:23
0

«Как мы будем различать методы» - это вопрос, который был задан в Stackoverflow и относится к нему конкретные методы в интерфейсах Java1.8

Ниже приведен пример, который должен ответить на этот вопрос:

interface A{
default public void m(){
System.out.println("Interface A: m()");
}
}

interface B{
default public void m(){
System.out.println("Interface B: m()");
}
}

 class C implements A,B { 

 public void m(){
  System.out.println("Concrete C: m()");   
 }

public static void main(String[] args) {
   C aC = new C();
   aC.m();
   new A(){}.m();
   new B(){}.m();
}
}

Класс C выше должен реализовывать свой собственный конкретный метод интерфейсов A и B. А именно:

 public void m(){
  System.out.println("Interface C: m()");   
 }

Чтобы вызвать конкретную реализацию метода из определенного интерфейса , вы можете создать экземпляр > interface и явно вызывают конкретный метод этого интерфейса

Например, следующий код вызывает конкретную реализацию метода m () из интерфейса A :

new A(){}.m();

Вывод вышеупомянутого будет:

Интерфейс A: m ()

ответил Mark Burleigh 26 WedEurope/Moscow2018-12-26T15:07:56+03:00Europe/Moscow12bEurope/MoscowWed, 26 Dec 2018 15:07:56 +0300 2018, 15:07:56
0

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

ответил Peter 6 Jpm1000000pmMon, 06 Jan 2014 20:15:54 +040014 2014, 20:15:54

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132