2016-08-29 3 views
0

인터페이스의 정적 메서드 (동일한 인터페이스의 두 메서드 - 기본값은 1이고 다른 하나는 정적 임)에서 기본 메서드를 호출해야합니다. 이것이 가능한가? 그렇다면 어떻게해야합니까?정적 메서드 내에서 기본 메서드 호출

interface A{ 
default void callee(){ 
     //do something here 
    } 

    static void caller(){ 
     //call callee() method anyhow 
    } 
} 
+0

이 코드를 보여 당신이 구체적인 문제가 무엇을 말 해주세요. – AlexR

+2

인스턴스 메소드를 호출해야 할 때 정적 메소드가 정적 일 필요가있는 이유는 무엇입니까? 동작이 상태에 따라 다르면 정적이 아닐 것입니다. – Fildor

+2

나는'정적 void 호출자 (A a) {a.callee(); }'나는 그것이 당신이 찾고있는 것이 아닌가 의심 스럽다. 그리고 개인적으로 나는이 경우 인스턴스 메서드로 만들 것입니다. 무효 반환 유형의 그것은 내가 어떤 인스턴스의 상태를 변경한다고 가정합니다. 어쨌든 인스턴스가 필요합니다. 나는 어떻게 든 이것이 x-y-Problem 일 수 있다고 생각합니다. 너 뭐하려고? – Fildor

답변

3

당신은 비 정적 메서드를 호출 할 경우 필요합니다 코드 부분에서

봐 더 나은 내 질문을 이해합니다.

static void caller() { 
    new A(){}.callee(); 
} 

정적이 아닌 호출을 피하는 것이 좋습니다. 정적 메서드에 callee 부분을 추출 할 수 있다고 가정합니다.

+0

고맙습니다 @ Sergey Rybalkin –

2

기본 메소드는 인터페이스를 구현하는 모든 클래스에서 상속 된 '기본'메소드입니다. 이렇게하면 인터페이스를 구현하는 모든 클래스에 대해 메소드를 다시 작성하지 않아도됩니다. 'A'인터페이스를 구현하는 클래스의 객체 인스턴스를 사용하여 callee 'A'에서 기본 메소드 만 호출 할 수 있습니다.

  1. 정적 '발신자'메서드에 대한 매개 변수로 A-개체를 전달할 :

    당신은 두 가지 옵션이 있습니다.

    interface A { 
        default void callee(){ 
         //do something here 
        } 
    
        static void caller(A anAInstance){ 
         anAInstance.callee(); 
        } 
    } 
    
  2. 익명의 클래스를 만듭니다. 기본 방법에 대한 자세한 내용은

interface A { 
    default void callee(){ 
     //do something here 
    } 

    static void caller(){ 
     new A(){}.callee(); 
    } 
} 

볼 : https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

관련 문제