2011-12-24 5 views
2

나는 passing function as parameter에 대한 다음 응답을 읽었다.자바 - 매개 변수로 함수

그래도 아이디어를 얻지 못합니다. 내가 알 수있는 바와 같이 나는 예를 들어, 인터페이스를 만들 수 있습니다, 죄 (X), COS (X) 등

: 내 기능은 어떤 기능을 얻을 수 있습니다

public interface functionI<T> { 

} 

그것은 포장 것이라고.

지금 내 기능을 가지고 :

public void needToDo(functionI<Integer> a, int x0Par, int hPar){ 
} 

(내가 죄를 가지고있는 경우 needToDo, 예를 들어, 최대를 함수 n 개의 x0par 및 hPar의 x를 대체 값해야하고, 발견 (x)를, I. sin (x0Par)와 sin (hPar)의 최대 값을 찾아야합니다.

함수에서 어떻게 사용하는지 이해하지 못했습니다. 함수를 구했을 때 어떻게해야하는지 어떻게 알 수 있습니까? 무엇이든 (다항식, sin (x) 등)

+3

귀하의 인터페이스에는 현재 약간의 문제가있는 메소드가 없습니다 ... 그리고 우리는 'needToDo'가 무엇을 성취하려고하는지 알지 못합니다. –

+0

@JonSkeet 나는 그것을 편집합니다. –

+0

이 게시물을 참조하십시오 http://stackoverflow.com/questions/2186931/java-pass-method-as-parameter –

답변

5

다음과 같이 표시 :

public interface Function1<RESULT,INPUT> { 
    RESULT call(INPUT input); 
} 

public class Sin implements Function1<Double,Double> { 
    public static final Sin instance = new Sin(); 
    private Sin() { 
    } 
    public Double call(Double x) { 
     return Math.sin(x); 
    } 
} 

public Double needToDo(Function1<Double,Double> aFunction, Double x0Par, Double hPar) { 
    Double d1 = aFunction.call(x0Par); 
    Double d2 = aFunction.call(hPar); 
    return d1 > d2 ? d1 : d2; 
} 

public static void main(String[] args) { 
    Double x0Par = 10.2; 
    Double hPar = 1.9; 
    Double ret = needToDo(Sin.instance, x0Par, hPar); 
    System.out.println(ret); 
} 
3

이렇게 작동하지 않습니다. Java에서는 매개 변수로 임의의 함수를 전달할 수 없으며, 일반적으로 일반적인 사운 딩 기능을 가진 객체를 전달합니다.

따라서 execute 메서드가있는 MathOperation 인터페이스를 정의하고 double을 반환하고 double을 반환 할 수 있습니다.

public interface MathOperation { 
    double execute(double x); 
} 

그리고 당신은 당신이

같은 needToDo에 대한 온 - 더 - 플라이 기능을 만들 수

public class Sin implements MathOperation { 
    public double execute(double x) { return Math.sin(x); } 
} 

을 만들고

public void needToDo(MathOperation op, double x) { 
    System.out.println(op.execute(x)); 
} 

처럼 사용하는 기능을 가질 수있다

... 
needToDo(new MathOperation() { 
    public double execute(double x) { return x * 2.0; } 
}); 
... 

그러나 Math.sin을 매개 변수로 전달할 수는 없습니다. 당신이 할 수있는 반사 비법이 있지만, 그것은 또 다른 문제입니다.

관련 문제