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>
g
은 m
코드는 문제없이 컴파일됩니다.
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 여야합니다. 이
이 m
이 단항 때 g
이 U.
에 대해 아무것도 추가하지 않지만 ECJ는을 허용으로이 유럽 사법 재판소 또는 javac의에 문제가있는 경우 컴파일러는 나 또한 혼란 스러워요, g
가있는 경우 객체 선택,하지만 것 같다 코드 및 javac 않습니다. 그중 하나만 정확할 수 있습니다.