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();
이것은 다음과 같이 사용될 수 있습니다 (인터페이스 A
와 C
기본 방법이 있다고 가정 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
'IT story' 카테고리의 다른 글
JavaScript에서 가장 빠른 MD5 구현 (0) | 2020.04.28 |
---|---|
입력 유형 = "제출"Vs 버튼 태그는 서로 호환됩니까? (0) | 2020.04.28 |
래퍼 클래스 란 무엇입니까? (0) | 2020.04.28 |
@ Scripts.Render (“~ / bundles / jquery”)를 사용해야하는 이유 (0) | 2020.04.28 |
uint8_t vs unsigned char (0) | 2020.04.28 |