2013-09-04 3 views
2

저는 기능 프로그래밍에 대해 조금 최근에 놀아 왔고, 저에게있어 의심 스럽습니다. 하지만 자바에서 할 수있는 일이 있으며 할 수 있는지 확실하지 않습니다.Java의 메소드에 대한 참조

나는 'A'유형의 'ob'개체를 가지고 있습니다. 나는 또한 ob에 첨부하고 싶을 수도있는 methdods 라이브러리 (수천 가지, 자동 생성 된 라이브러리들 - 동일한 주장들을 취함)를 가지고있다. 내가 쓸 수 있도록하고 싶습니다 것은 다음

A ob = new A(Someint, someint, Method mymethod); 

그리고 (A 이내) 쓸 수의 라인)

X = mymethod.call(arg1, arg2); 

날 어떻게하자 자바에 뭔가가 거기에 함께 뭔가 이? 아니면 내가 빛으로부터 너무 멀리 떨어져 있었나요?

답변

1
같은 람다 라인 p -> p.getPrice() 및 함수 참조를 작성할 수이와

http://jdk8.java.net/lambda/

를 시도 제안 (이 자바 기능을 지원하지만, 진정한 기능적 언어와 같은 아무것도가 있더라도으로)

정확히을 Java에서 사용할 수 없습니다. 이 문제를 해결하기 위해 익명의 내부 클래스를 사용할 수 있습니다. 는 "함수 객체를"만들 즉시

interface Func <A, B> { 
    A run (B arg); 
} 

인스턴스화 그것은 :

인터페이스를 정의

C ob = frobn (someint, 
       new Func <int, long>() { 
        @Override 
        int run (long arg) { 
         // do something to return that int 
        } 
       }); 

당신은 다음과 같이 frobn 내부에 전달 Func 전화 :

C frobn (int some, Func <int, long> fun) { 
    // do something 
    int foo = fun.run (bar); 
    // do something 
} 

네, 그건 못생긴 그린스 패닝입니다.

0
Passing a Method reference to a method and then invoking the method with parameters. 

이렇게하는 방법에는 여러 가지 맛이 있습니다. 이 교육용 예제에서는 을 사용하여 하나의 Object를 매개 변수로 사용하는 myMethod라는 정적 메서드를 사용합니다.

import java.lang.reflect.Method; 

public class Tester54 { 

    static public class J42 { 
     static public Object myMethod(final Object o) { 
      return "Wow:" + o.toString(); 
     } 
    } 

    private static void 
    doIt(final Class<?> c, final Method m, final Class<?>[] types, final Object[] args) 
     throws Exception { 
     final Object s = m.invoke(J42.class, new Object[] { "wow" }); 
     System.out.println(s); 
    } 

    public static void main(final String[] a) throws Exception { 
     final Method m = J42.class.getMethod("myMethod", new Class<?>[] { Object.class }); 
     final Class<?>[] types = new Class[] { Object.class }; 
     final Object[] args = new Object[] { "wow" }; 
     doIt(J42.class, m, types, args); 
    } 

}

관련 문제