В интерфейсе коллекции я нашел метод с именем, removeIf()
который содержит его реализацию.
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
Я хочу знать, есть ли способ определить тело метода в интерфейсе?
Что такое default
ключевое слово и как оно работает?
Ответы:
С https://dzone.com/articles/interface-default-methods-java
public interface A { default void foo(){ System.out.println("Calling A.foo()"); } } public class ClassAB implements A { }
Есть один общий вопрос, который люди задают о методах по умолчанию, когда впервые слышат о новой функции:
Пример, иллюстрирующий эту ситуацию:
public interface A { default void foo(){ System.out.println("Calling A.foo()"); } } public interface B { default void foo(){ System.out.println("Calling B.foo()"); } } public class ClassAB implements A, B { }
Этот код не компилируется со следующим результатом:
java: class Clazz inherits unrelated defaults for foo() from types A and B
Чтобы исправить это, в Clazz мы должны решить это вручную, переопределив конфликтующий метод:
public class Clazz implements A, B { public void foo(){} }
Но что, если бы мы хотели вызвать реализацию метода foo () по умолчанию из интерфейса A вместо реализации нашей собственной.
Можно ссылаться на A # foo () следующим образом:
public class Clazz implements A, B { public void foo(){ A.super.foo(); } }
источник
Эти методы называются методами по умолчанию. Метод по умолчанию или метод Защитника - одна из недавно добавленных функций в Java 8.
Они будут использоваться, чтобы позволить методу интерфейса предоставлять реализацию, используемую по умолчанию, в случае, если конкретный класс не предоставляет реализацию для этого метода.
Итак, если у вас есть интерфейс с методом по умолчанию:
public interface Hello { default void sayHello() { System.out.println("Hello"); } }
Следующий класс вполне допустим:
public class HelloImpl implements Hello { }
Если вы создаете экземпляр
HelloImpl
:Hello hello = new HelloImpl(); hello.sayHello(); // This will invoke the default method in interface
Полезные ссылки:
источник
Я провел небольшое исследование и обнаружил следующее. Надеюсь это поможет.
Обычные методы интерфейса объявлены как абстрактные и должны быть определены в классе, реализующем интерфейс. Это «обременяет» разработчика класса ответственностью за реализацию каждого объявленного метода. Что еще более важно, это также означает, что расширение интерфейса невозможно после «публикации». В противном случае всем разработчикам пришлось бы адаптировать свою реализацию, нарушая обратную совместимость исходного кода и двоичную совместимость.
Чтобы справиться с этими проблемами, одной из новых функций JDK 8 является возможность расширения существующих интерфейсов с помощью методов по умолчанию. Методы по умолчанию не только объявляются, но и определяются в интерфейсе.
источник