다음과 같은 이유 때문에 "참조가 모호합니다"로 작동하지 않는 이유를 알고 싶습니다. javac 팀에보고 할 가치가 있습니까? 모두 CheckedFunction
및 CheckedToLongFunction
그렇게 명시 적으로 람 바어의 입력 형식이 유용 아무것도 추가하지 보인다 지정 참조 형식을 가지고 있기 때문에 왜이 람다 관련 형식 유추가 실패합니까?
import java.util.function.Function;
import java.util.function.ToLongFunction;
import org.junit.Test;
public class LambdaTest {
@FunctionalInterface
public static interface CheckedFunction<U,R>
{
R apply(U value) throws Exception;
}
@FunctionalInterface
public static interface CheckedToLongFunction<T>
{
long apply(T i) throws Exception;
}
public static <T,R> Function<T,R> unchecked(CheckedFunction<T,R> func)
{
return value -> {
try
{
return func.apply (value);
}
catch(RuntimeException e)
{
throw e;
}
catch(Exception e)
{
throw new RuntimeException(e);
}
};
}
public static <T> ToLongFunction<T> unchecked(CheckedToLongFunction<T> func)
{
return value -> {
try
{
return func.apply (value);
}
catch(RuntimeException e)
{
throw e;
}
catch(Exception e)
{
throw new RuntimeException(e);
}
};
}
public void
bar(Function<Object,Object> fn) {
System.out.println("Function");
}
@Test public void
test() {
bar (a -> a); //OK
bar (unchecked (a -> a)); //Should be OK, but receive "reference to unchecked is ambiguous"
bar (unchecked ((Object a) -> a)); //OK
}
}
당신이 볼 수 있듯이
는 예는 재미있다. 그러나 코드를 컴파일 할 수 있습니다.unchecked(CheckedToLongFunction)
은 프리미티브를 반환하는 람다를 생성하기 때문에, 을 필요로하므로 unckeched(CheckedFunction)
을 모호하지 않게 호출해야합니다.
저는 특히 JLS의 해결책을 찾고 있습니다. JLS가 이것을 지정하지 않으면 javac 버그로 제출할 수 있습니다.
'ToLongFunction' 유형이 여기에있는 그림에 있어서는 안됩니다. 모호한'unchecked' 호출입니다. 그리고 어떤 경우 든'bar'는'ToLongFunction'이 아닌'Function'을 기대합니다. –
lambda * input * 형식을 지정하면 해상도가 제대로 작동한다는 점을 지적하고 싶습니다. 입력 유형을 지정해도 자동 복싱으로 인한 모호성이 해결되지 않으므로 요인이 아닙니다. –