2017-10-03 7 views
-1

내 상황은 :Java 8 : 정적 메서드를 다른 메서드의 매개 변수로 사용하려면 어떻게해야합니까?

class Test { 
    private static void xxx(String s) throws SQLException { 
     System.out.println(s); 
    } 
    private static void yyy(Consumer<String> f) { 
     try { 
      f.apply('hello'); 
     } catch (SQLException e) { 
      System.out.println("error"); 
     } 
    } 
    public static void main(String args[])() { 
     yyy(xxx); // <-- not working!! 
    } 
} 

난 할 노력하고있어 또 다른 정적 메서드의 매개 변수로 정적 메서드를 전달하는 것입니다. 나는 yyy 메서드의 서명을 선언하는 올바른 방법은 Consumer이라고 생각하지만, 다른 부분에 대해서는 잘 모르겠다. xxx을 매개 변수로 전달한다.

내가 찾은 가능한 솔루션은

yyyy(s -> xxx(s)); 

을 작성하는 것입니다 그러나 그것은 추한 외모와 xxx 예외를 throw하면 정말 작동하지 않습니다.

yyy(Test::xxx); 

를 사용하여

나는 당신이 방법 참조를 사용할 수 있습니다

error: incompatible thrown types SQLException in method reference 
+2

정적 멤버 (필드, 메서드, 중첩 된 클래스 ...)에 대한 올바른 참조는 클래스의 이름을 포함해야합니다. 따라서'Test :: xxx'가 아니라'xxx'입니다. – RealSkeptic

답변

2

이 오류가 발생했습니다 :

class Test { 
    private static void xxx(String s) { 
     //do something with string 
    } 
    private static void yyy(Consumer<String> c) { 
     c.accept("hello"); 
    } 
    public static void zzz() { 
     yyy(Test::xxx); 
    } 
} 
+0

대단히 감사합니다! 내가 사용하려고했던 추가 세부 사항이 있었는데 그 질문을 편집 할 수 있습니다. xxx가 예외를 throw하면 _Consumer_의 선언을 변경해야합니까? 왜냐하면 그것은 여전히 ​​저에게 저에게 오류를주기 때문입니다. – heapOverflow

+0

@heapOverflow 체크되지 않은 예외를 throw하면 해당 오류가 발생하지 않습니다. – Eran

+0

불행히도 제 경우에는 확인 된 예외 (SQLException)이므로 제 선택이 아닙니다. 물론 나는 잡기를 시도 할 수 있었다. 그러나 나는 그것을 피하려고 노력하고 있었다. – heapOverflow

1

당신은 코드 아래에 시도 할 수 있습니다

class Test { 
    private static Consumer<String> xxx(String s) { 
     //do something with string 
     return null;// return Consumer for now passing null 
    } 

    private static void yyy(Consumer<String> f) { 
     //do something with Consumer 
    } 

    public static void zzz(){ 
     yyy(xxx("hello")); 
    } 
}