IT story

Java에서 기본 메소드를 명시 적으로 호출

hot-time 2020. 4. 28. 08:24
반응형

Java에서 기본 메소드를 명시 적으로 호출


Java 8에는 기존 구현을 수정하지 않고도 인터페이스를 확장 할 수있는 기본 방법도입되었습니다 .

다른 인터페이스에서 충돌하는 기본 구현으로 인해 해당 메서드가 재정의되었거나 사용할 수없는 경우 메서드의 기본 구현을 명시 적으로 호출 할 수 있는지 궁금합니다.

interface A {
    default void foo() {
        System.out.println("A.foo");
    }
}

class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }
    public void afoo() {
        // how to invoke A.foo() here?
    }
}

위의 코드를 고려하면 A.foo()클래스 B의 메소드에서 어떻게 호출 합니까?


에 따라 이 문서 는 인터페이스의 기본 방법에 액세스 A사용

A.super.foo();

이것은 다음과 같이 사용될 수 있습니다 (인터페이스 AC기본 방법이 있다고 가정 foo())

public class ChildClass implements A, C {
    @Override    
    public void foo() {
       //you could completely override the default implementations
       doSomethingElse();
       //or manage conflicts between the same method foo() in both A and C
       A.super.foo();
    }
    public void bah() {
       A.super.foo(); //original foo() from A accessed
       C.super.foo(); //original foo() from C accessed
    }
}

A그리고 C둘 다 가질 수 .foo()방법 및 특정 기본 구현을 선택할 수 있습니다 또는 당신은 당신의 새의 일환으로 (또는 둘 다) 하나를 사용할 수 있습니다 foo()방법. 동일한 구문을 사용하여 구현 클래스의 다른 메소드에서 기본 버전에 액세스 할 수도 있습니다.

메소드 호출 구문에 대한 공식적인 설명은 JLS의 15 장 에서 찾을 수 있습니다 .


아래 코드가 작동합니다.

public class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }

    void aFoo() {
        A.super.foo();
    }

    public static void main(String[] args) {
        B b = new B();
        b.foo();
        b.aFoo();
    }
}

interface A {
    default void foo() {
        System.out.println("A.foo");
    }
}

산출:

B.foo
A.foo

이 답변은 주로 질문 45047550 에서 온 사용자를 위해 작성 되었습니다.

Java 8 interfaces introduce some aspects of multiple inheritance. Default methods has an implemented function body. To call a method from the super class you can use the keyword super, but if you want to make this with a super interface it's required to name it explicitly.

class ParentClass {
    public void hello() {
        System.out.println("Hello ParentClass!");
    }
}

interface InterfaceFoo {
    default public void hello() {
        System.out.println("Hello InterfaceFoo!");
    }
}

interface InterfaceBar {
    default public void hello() {
        System.out.println("Hello InterfaceBar!");
    }
}

public class Example extends ParentClass implements InterfaceFoo, InterfaceBar {
    public void hello() {
        super.hello(); // (note: ParentClass.super is wrong!)
        InterfaceFoo.super.hello();
        InterfaceBar.super.hello();
    }

    public static void main(String[] args) {
        new Example().hello();
    }
}

Output:

Hello ParentClass!
Hello InterfaceFoo!
Hello InterfaceBar!


You don't need to override the default method of an interface. Just call it like the following:

public class B implements A {

    @Override
    public void foo() {
        System.out.println("B.foo");
    }

    public void afoo() {
        A.super.foo();
    }

    public static void main(String[] args) {
       B b=new B();
       b.afoo();
    }
}

Output:

A.foo

참고URL : https://stackoverflow.com/questions/19976487/explicitly-calling-a-default-method-in-java

반응형