2013-02-26 3 views
3

그래서 우리는이 같은 Func.java라는 인터페이스를 보이는 것을 :퍼스트 클래스 기능

public interface Func<A,B> { 
    public B apply(A x); 
} 

그런 다음 우리는 다음과 같이 mainClass.java라는 메인 클래스를, 보이는이있는 :

public class mainClass{ 
    public static void main(String[] args) { 
    } 

    public static <A,B,C> Func<A,C> compose(final Func<A,B> f, final Func<B,C> g){ 
     return new Func<A,C>(){ 
      public C apply(A x){ 
       return g.apply(f.apply(x)); 
      } 
     }; 
    } 
} 

주 방법에서이 작성 메소드를 호출하는 방법과이 코드가 실제로 컴파일되는 방법을 잘 모르겠습니다! 내 말은,이 일을하기 위해 여기 자바 제네릭이 필요한가요?

+0

컴파일 해 보셨습니까? –

답변

1
public class FirstClassFunction { 
    interface Func< A, B > { 
     public B apply(A x); 
    } 

    static <A, B, C> 
    Func< A, C > compose(final Func< A, B > f, final Func< B, C > g) { 
     return new Func< A, C >() { 
     @Override public C apply(A x) { 
      return g.apply(f.apply(x)); 
     }}; 
    } 

    public static void main(String[] args) { 
     Func< Double, Character > f = 
     new Func< Double, Character >(){ 
      @Override public Character apply(Double x) { 
       return 'a'; 
      }}; 
     Func< Character, String > g = 
     new Func< Character, String >(){ 
      @Override public String apply(Character x) { 
       return "Hello"; 
      }}; 
     Func< Double, String > c = compose(f, g); 
     System.out.println(c.apply(3.14)); 
    } 
} 
1

예 :

정수 (B)에 문자열 (A)을 변환하는 Func<A,B>.

class Converter implements Func<String, Integer> { 
    @Override 
    public Integer apply(String x) { 
     // System.out.println("Converter converting String \"" + x + "\" to an Integer"); 
     return Integer.valueOf(x); 
    } 
} 

문자열 (B) 정수 (A)를 변환하여 다른 Func<A,B> 구현, 즉 그 Strig

class Binary implements Func<Integer, String> { 
    @Override 
    public String apply(Integer x) { 
     // System.out.println("Binary converting Integer " + x + " to binary String"); 
     return Integer.toBinaryString(x); 
    } 
} 

의 이진 표현을 보여주는 main 방법을 나타낸다.

public static void main(String[] args) { 
    // compose those to functions and you can convert strings representing 
    // numbers (base 10) to Strings that represent the same number (base 2) 
    Func<String, String> binaryStringConverter = compose(new Converter(), new Binary()); 
    System.out.println(binaryStringConverter.apply("123")); 
} 

더 나은 당신이 System.out.println() 제표의 주석을 해제하고 코드를 실행할 수 있습니다 무슨 일이 일어나고 있는지 이해합니다.

public class mainClass { 
    public static <A, B, C> Func<A, C> compose(final Func<A, B> f, final Func<B, C> g) { 
     return new Func<A, C>() { 
      public C apply(final A x) { 
       return g.apply(f.apply(x)); 
      } 
     }; 
    } 

    public static void main(final String[] args) { 
     Func<String, Double> toDouble = new Func<String, Double>() { 
      public Double apply(final String x) { 
       return Double.parseDouble(x); 
      } 
     }; 
     Func<Double, Integer> toInt = new Func<Double, Integer>() { 
      public Integer apply(final Double x) { 
       return (int) x.doubleValue(); 
      } 
     }; 
     Func<String, Integer> composed = compose(toDouble, toInt); 
     System.out.println("Composed: " + composed.apply("1.23")); 
    } 
} 

난 당신이 제네릭이 필요한 것으로까지 요구하고 무엇을 아주 확실하지 않다 : 여기

3

는 편지 쓰기를 호출 할 수있는 방법이다. 문자 그대로의 감각으로, 그들은 그렇지 않습니다. Java generics는 타입 안전성을 제공합니다. 확실히 완전히 스크랩하고 A, B 및 C를 대신 오브젝트로 변경할 수 있습니다. 그러나 String, Integer 및 Double을 사용하는 예에서와 같이 사용중인 유형을 명시 적으로 정의하려면이 경우 제네릭을 사용해야합니다.

+0

+1, 좋은 예. – jlordo

0

실제 숫자 연산만을 포함하는 문제 도메인에서 작업하는 경우 Func 인터페이스는 public double apply(double x) 일 수 있습니다. 그러나 제네릭을 사용하면 기능을 한 유형에서 다른 유형으로 변환 할 수있는 유연성을 얻을 수 있습니다. compose 메서드는 일반적인 수학 함수 구성과 마찬가지로 함수를 연결하는 방법을 제공합니다.