2017-02-16 5 views
1

Java의 유형 유추에 문제가 있습니다. 나는 javac의 1.8.0_121를 사용하고, 다음과 같은 코드는 이클립스 ECJ 컴파일 않습니다,하지만 javac의 다음과 같은 오류가 javac의 결과로이 컴파일javac 및 ecj를 사용하여 다른 유형의 추론 결과

import java.util.function.Function; 

public class Playbook { 

    static class A { 
    } 

    static class B { 
    } 

    static class P<T> { 
    } 

    static class V<T> { 
     static <T, U> V<U> m(P<T> src, Function<? super T, ? extends U> f, Function<? super U, ? extends T> g) { 
      return null; 
     } 

     void b(final P<T> other) { 

     } 
    } 

    public void bindTimeString1(P<A> p1, P<B> p2) { 
     V.m(p2, s -> new A(), t -> new B()).b(p1); 
    }  
} 

과 : 두 번째 매개 변수가 없으면

[ERROR] Playbook.java:[31,47] incompatible types: main.java.Playbook.P<main.java.Playbook.A> cannot be converted to main.java.Playbook.P<java.lang.Object> 

gm 코드는 문제없이 컴파일됩니다.

import java.util.function.Function;

public class Playbook { 

    static class A { 
    } 

    static class B { 
    } 

    static class P<T> { 
    } 

    static class V<T> { 
     static <T, U> V<U> m(P<T> src, Function<? super T, ? extends U> f) { 
      return null; 
     } 

     void b(P<T> other) { 

     } 
    } 

    public void bindTimeString2(P<A> p1, P<B> p2) { 
     V.m(p2, s -> new A()).b(p1); 
    } 
} 

왜 이것이 처음부터 실패하는지 이해할 수 없습니다. 코드에서 컴파일러가 추론 할 수

  • F는 U.를 확장 뭔가를 반환
  • 그램 더에 대해 추론 할 수있다 g의 몸 아무것도에서 U.
  • 의 기본 클래스는 뭔가를 받아 U.
  • f 몸체에서 A가 반환된다는 것을 알고 있으므로 A < : U가 true 여야합니다. 이
U.에 대한 잠재적 인 후보로 A 또는 객체 우리 잎이 경우, U. :
  • Var.b 그래서 u는 <을 만족하는 모든 종류의 수, U에 더 이상 제약을 두지 않는다

    m이 단항 때 g이 U.

    에 대해 아무것도 추가하지 않지만 ECJ는을 허용으로이 유럽 사법 재판소 또는 javac의에 문제가있는 경우 컴파일러는 나 또한 혼란 스러워요, g가있는 경우 객체 선택,하지만 것 같다 코드 및 javac 않습니다. 그중 하나만 정확할 수 있습니다.

  • 답변

    0

    현재 Java 9 Early Access Build가 오류없이 코드를 컴파일하므로 참조 문제는 발견되지 않았습니다. 이것으로부터 ECJ가 아니라 Java 8의 문제라고 결론을 내릴 것입니다.