구아바는 최근 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 등을 매개 변수로 사용하지 않는 이유는 무엇입니까?
답변
이미 일부 메소드가 변경되어 구아바를 사용하는 모든 사용자가 코드를 다시 컴파일해야한다는 뜻이 아닙니까? 그들은 일부 코드를 위반하지 않고 단순히 업그레이드 할 수 없습니다.
그 반대의 경우입니다. 즉, 셋업입니다 :
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에서
하지만 com.google.common.base.Function에 대해 컴파일 된 경우 해당 코드가 java.util.function.Function을 확장하는 com.google.common.base.Function을 사용한다는 것을 의미합니다. 즉, 해당 인스턴스에 인스턴스를 제공 할 때 java.util.function.Function으로서 사용하는 것이 안전 할 것입니다. – jontejj
@jontejj 바이트 코드는 guava 함수를 매개 변수로 사용하는 메소드를 참조합니다.이 메소드는 j.u.f.Function으로 변경된 경우에는 더 이상 존재하지 않습니다. 그리고 그들은 방법의 두 가지 버전을 가질 수 없습니다. 그렇지 않으면 람다 (쉽게)를 사용하는 능력을 깰 것입니다. –
버전 21.0 이전에 구아바와 함께 Java 8을 사용하는 클라이언트의 경우에는 의미가 있습니다. 나는 이유를 이해한다고 생각한다 : – jontejj
:
우리는 우리가 그 방법을 변경하려면 알고 있지만, 그것은 충분히 우리가 아직 전체 계획을 근무 한 적이없는 복잡. Guava의 기능 인터페이스와 관련된 일부 유틸리티는 Java 8 (예 : Predicates.instanceOf (Class) 대 Class :: isInstance)에서 완전히 중복되도록 렌더링되었지만 Suppliers.memoize와 같은 일부 유틸리티는 여전히 유용한 것처럼 보입니다. 우리가 모든 것을 바꾸기 시작하기 전에 이러한 방법으로 무엇을 할 것인가?
향후 Guava 릴리즈에서 이러한 문제에 대한 작업을 시작하겠습니다.하지만 지금은 이러한 메서드를 그대로 두는 것이 좋습니다. 일반적으로 이러한 메서드에 람다를 전달하는 것이 좋습니다.이 경우 컴파일러 옳은 일을 할 것입니다.
왜지도 구아바 버전 21.0과 같이 등 java.util.function.Function을지지 않습니다 : -
루이 Wasserman은
이 다음과 같은 방법으로 질문에 대한 답변 매개 변수?
충격이 너무 커서 21.0이 진열 될 때 완전히 계획되지 않았습니다.
어떻게 매개 변수 대신 com.google.common.base.Function
로 java.util.function.Function
을하지 않는, Maps
같은 클래스를 제공? 1.
com.google.common.base.Function
과 동일
는 java.util.function.Function
그래서 어떤 호환성 문제가 안 확장?
(부분적으로 인용문으로만 답변 됨) 예, 일부 문제가 있습니다. 그러나 안전한 측면에 있으려면 새로운 람다 표기법을 사용하십시오.
포팅 계획은 무엇입니까?
계획은 현재 해결 중입니다.
이 접근 방식은 22.0 버전이 출시 되었습니까?
(인용구 제외) 대부분 그렇지 않을 수 있습니다. 나는 확실히 말할 수는 없지만. 구아바의 현재 브랜치의 소스 코드를 확인하면 여전히 구아바의 Function
을 사용하고있는 것을 볼 수 있습니다.
부드러운 전환을 제공합니까? – jontejj