2017-02-14 13 views
2

구아바는 최근 require java 8으로 전환했습니다. 계급은 Maps과 같이 com.google.common.base.Function 대신 매개 변수로 java.util.function.Function을 사용하지 마십시오. com.sun.com.base.Function은 java.util.function.Function을 확장하므로 호환성 문제가 없어야합니다. 포팅 계획은 무엇입니까? 이 방법으로 22.0 버전이 출시 될 예정입니까?guava 버전 21.0의 Map이 java.util.function.Function 등을 매개 변수로 사용하지 않는 이유는 무엇입니까?

+0

부드러운 전환을 제공합니까? – jontejj

답변

4

이미 일부 메소드가 변경되어 구아바를 사용하는 모든 사용자가 코드를 다시 컴파일해야한다는 뜻이 아닙니까? 그들은 일부 코드를 위반하지 않고 단순히 업그레이드 할 수 없습니다.

그 반대의 경우입니다. 즉, 셋업입니다 :

class GuavaFun extends JavaFunc {} 

class JavaFunc {} 

그리고 당신은이 선언이 : 이런 식으로 호출

public static void test(GuavaFun f) { 

} 

:

test(new JavaFunc()); 

이 실패합니다.

경우에 당신은 JavaFun를 확장하고 그것을 만들 수 있습니다 :

class JavaFunc extends GuavaFun {} 

는 다음 중 하나 또는 시험 방법에 기타를 전달할 수 있습니다.

함수가 사전 java-8 스타일로 선언 된 경우이 오류는 중단되지만 람다는이 아닙니다.

public static void main(String[] args) { 

    java.util.function.Function<String, String> f2 = (String b) -> b.toUpperCase(); 

    test((String a) -> a.toUpperCase()); 
    test(f2); 

} 

public static void test(com.google.common.base.Function<String, String> f) { 

} 

람다 식은 실패하지만 두 번째 테스트 호출은 실패합니다. 여전히 @FunctionalInterface이기 때문에 Guava's discussion group에서

+0

하지만 com.google.common.base.Function에 대해 컴파일 된 경우 해당 코드가 java.util.function.Function을 확장하는 com.google.common.base.Function을 사용한다는 것을 의미합니다. 즉, 해당 인스턴스에 인스턴스를 제공 할 때 java.util.function.Function으로서 사용하는 것이 안전 할 것입니다. – jontejj

+2

@jontejj 바이트 코드는 guava 함수를 매개 변수로 사용하는 메소드를 참조합니다.이 메소드는 j.u.f.Function으로 변경된 경우에는 더 이상 존재하지 않습니다. 그리고 그들은 방법의 두 가지 버전을 가질 수 없습니다. 그렇지 않으면 람다 (쉽게)를 사용하는 능력을 깰 것입니다. –

+0

버전 21.0 이전에 구아바와 함께 Java 8을 사용하는 클라이언트의 경우에는 의미가 있습니다. 나는 이유를 이해한다고 생각한다 : – jontejj

4

:

우리는 우리가 그 방법을 변경하려면 알고 있지만, 그것은 충분히 우리가 아직 전체 계획을 근무 한 적이없는 복잡. Guava의 기능 인터페이스와 관련된 일부 유틸리티는 Java 8 (예 : Predicates.instanceOf (Class) 대 Class :: isInstance)에서 완전히 중복되도록 렌더링되었지만 Suppliers.memoize와 같은 일부 유틸리티는 여전히 유용한 것처럼 보입니다. 우리가 모든 것을 바꾸기 시작하기 전에 이러한 방법으로 무엇을 할 것인가?

향후 Guava 릴리즈에서 이러한 문제에 대한 작업을 시작하겠습니다.하지만 지금은 이러한 메서드를 그대로 두는 것이 좋습니다. 일반적으로 이러한 메서드에 람다를 전달하는 것이 좋습니다.이 경우 컴파일러 옳은 일을 할 것입니다.

  1. 왜지도 구아바 버전 21.0과 같이 등 java.util.function.Function을지지 않습니다 : -

    루이 Wasserman은

이 다음과 같은 방법으로 질문에 대한 답변 매개 변수?

충격이 너무 커서 21.0이 진열 될 때 완전히 계획되지 않았습니다.

  • 어떻게 매개 변수 대신 com.google.common.base.Functionjava.util.function.Function을하지 않는, Maps 같은 클래스를 제공? 1.

  • com.google.common.base.Function과 동일

    java.util.function.Function 그래서 어떤 호환성 문제가 안 확장?

    (부분적으로 인용문으로만 답변 됨) 예, 일부 문제가 있습니다. 그러나 안전한 측면에 있으려면 새로운 람다 표기법을 사용하십시오.

  • 포팅 계획은 무엇입니까?

    계획은 현재 해결 중입니다.

  • 이 접근 방식은 22.0 버전이 출시 되었습니까?

    (인용구 제외) 대부분 그렇지 않을 수 있습니다. 나는 확실히 말할 수는 없지만. 구아바의 현재 브랜치의 소스 코드를 확인하면 여전히 구아바의 Function을 사용하고있는 것을 볼 수 있습니다.

  • +0

    이것은 구아바의 함수/술어를 자바 함수/술어로 완전히 바꾸는 것에 관한 것이다. 구아바의 인터페이스는 단일 추상 메소드를 선언하기 때문에'@ FunctionalInterface'이기 때문에 람다/메소드 참조가 작동합니다. – Eugene

    +1

    질문 게시에는 약 5 개의 질문이 있습니다. (적어도)이 답은 세 명이 대답합니다. –

    +0

    예, 좋은 지적입니다. – Eugene