Что произойдет, если два интерфейса содержат один и тот же метод по умолчанию?

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

interface alpha {
  default void reset() {
    System.out.println("This is alpha version of default");
  }
}

interface beta {
  default void reset() {
    System.out.println("This is beta version of default");
  }
}

class MyClass implements alpha, beta {
  void display() {
    System.out.println("This is not default");
  }
}

class main_class {
  public static void main(String args[]) {
    MyClass ob = new MyClass();
    ob.reset();
    ob.display();
  }  
}

тогда что будет? А также я получаю несвязанную ошибку с этой программой.


person Manohar Kumar    schedule 25.12.2014    source источник
comment
Интерфейс является чистой абстракцией и представляет собой только объявления, а не реализации.   -  person Shriram    schedule 25.12.2014
comment
@Shriram В Java 8 они могут содержать реализации с использованием методов по умолчанию.   -  person Bohuslav Burghardt    schedule 25.12.2014
comment
Я подозреваю, что несвязанная ошибка говорит вам ответ на этот вопрос.   -  person chrylis -cautiouslyoptimistic-    schedule 25.12.2014


Ответы (2)


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

. Вы можете решить эту проблему, реализуя метод E.g.

class MyClass implements alpha, beta {
  void display() {
    System.out.println("This is not default");
  }

  @Override
  public void reset() {
    //in order to call alpha's reset
    alpha.super.reset();
    //if you want to call beta's reset 
    beta.super.reset();

  }
}
person sol4me    schedule 25.12.2014
comment
Когда я пытаюсь запустить приведенный выше код с помощью метода @override, я получаю сообщение об ошибке cannot find symbol @override. - person Manohar Kumar; 26.12.2014
comment
@ManoharKumar @Override пишется с большой буквы. - person 11684; 26.12.2014
comment
Итак, чтобы вызвать альфа-версию метода reset(), какой оператор мы должны использовать в коде @Override public void reset(){ }. - person Manohar Kumar; 26.12.2014

По сути, эти два метода одинаковы в классе, который их реализует. Если вы попытаетесь реализовать два метода, например, в Intellij, вы получите только один метод. Вы не можете объявить их, даже если хотите иметь разные подписи для них обоих.

person Ojonugwa Jude Ochalifu    schedule 25.12.2014