Programing

인터페이스에 정의 된 메소드의 "기본"구현은 무엇입니까?

lottogame 2020. 9. 4. 08:02
반응형

인터페이스에 정의 된 메소드의 "기본"구현은 무엇입니까?


컬렉션 인터페이스에서 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

Java 8에는 개발자가 이러한 인터페이스의 기존 구현을 중단하지 않고 인터페이스에 새 메서드를 추가 할 수있는 "기본 메서드"또는 (Defender 메서드) 새 기능이 도입되었습니다. 구체적인 클래스가 해당 메소드에 대한 구현을 제공하지 못하는 상황에서 기본값으로 사용할 인터페이스 정의 구현을 허용하는 유연성을 제공합니다.

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(){}
}

그러나 우리 자신을 구현하는 대신 인터페이스 A에서 foo () 메서드의 기본 구현을 호출하려면 어떻게해야합니까?

다음과 같이 A # foo ()를 참조 할 수 있습니다.

public class Clazz implements A, B {
    public void foo(){
       A.super.foo();
    }
}

이러한 메서드를 기본 메서드라고합니다. 기본 방법 또는 Defender 방법Java 8에 새로 추가 된 기능 중 하나입니다 .

They will be used to allow an interface method to provide an implementation used as default in the event that a concrete class doesn't provide an implementation for that method.

So, if you have an interface, with a default method:

public interface Hello {
    default void sayHello() {
        System.out.println("Hello");
    }
}

The following class is perfectly valid:

public class HelloImpl implements Hello {

}

If you create an instance of HelloImpl:

Hello hello = new HelloImpl();
hello.sayHello();  // This will invoke the default method in interface

Useful Links:


I did a bit of research and i found the following. Hope this helps.

Existing problem

Normal interface methods are declared as abstract and must be defined in the class that implements the interface. This 'burdens' the class implementer with the responsibility to implement every declared method. More importantly, this also means that extending an interface is not possible after 'publication'. Otherwise, all implementers would have to adapt their implementation, breaking backwards source and binary compatibility.

Solution adopted in Java 8

To cope with these problems, one of the new features of JDK 8 is the possibility to extend existing interfaces with default methods. Default methods are not only declared, but also defined in the interface.

Important points to note

  1. Implementers can choose not to implement default methods in implementing class.
  2. Implementers can still override default methods, like regular non-final class methods can be overridden in subclasses.
  3. Abstract classes can even (re)declare default methods as abstract, forcing subclasses to reimplement the method (sometimes called 're-abstraction').

참고URL : https://stackoverflow.com/questions/18286235/what-is-the-default-implementation-of-method-defined-in-an-interface

반응형