我想了解爲什麼以下情況不能與「引用不明確」的情況一起使用,而應該不是。值得向javac團隊報告嗎?爲什麼這個與lambda有關的類型推斷失敗?
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
}
}
正如你所看到的,例子很有趣,因爲這兩個CheckedFunction
和CheckedToLongFunction
採取引用類型,所以明確指定蘭巴的輸入類型似乎添加沒什麼用處。但是,它可以讓代碼編譯。
應該調用unckeched(CheckedFunction)
而沒有歧義,因爲unchecked(CheckedToLongFunction)
會生成返回原語的lambda,而bar需要Object
。
我特別尋找JLS的解決方案。如果JLS沒有指定這個,我可以嘗試將它作爲javac錯誤提交。
「ToLongFunction」類型不應該在這裏。這是'unchecked'的含義模糊的調用。無論如何,'bar'需要一個'Function',而不是'ToLongFunction'。 – 2014-10-05 20:05:29
我想指出,如果指定了lambda的* input *類型,則解析工作正常。指定輸入類型不會解決任何由自動裝箱造成的歧義,因此它不是一個因素。 – 2014-10-08 20:20:38