Java8 [无法推断类型变量]问题

Java 8 [cannot infer type variables] problem

我有一个 ThrowingFunction<T, R, E extends Exception> 功能接口,带有一个具有此签名的抽象方法:R apply(T t) throws E.

我在功能接口中有一个静态实用方法,允许用户将 ThrowingFunction<T, R, E extends Exception> 个实例转换为 Function<T, R> 个实例:

static <T, R> Function<T, R> unchecked (final ThrowingFunction<T, R, ?> tf)
{
    // code here
}

这里的问题是,如果我将方法引用 URL::new 传递给 unchecked,编译器不会推断出类型参数 TR静态实用方法 ?

final URL url = unchecked(URL::new).apply("http://www.examples.com");

我的意思是,URL::new 不是 ThrowingFunction<String, URL, MalformedURLException> 的有效候选人,因此 TR 应该推断为 StringURL分别是?

你是对的,它应该可以工作,这很可能与你正在使用方法引用这一事实有关,而编译器不知何故变得混乱,有两种解决方案:

// a lambda
ThrowingFunction.unchecked((String x) -> new URL(x));


// an explicit cast
ThrowingFunction.unchecked((ThrowingFunction<String, URL, MalformedURLException>)URL::new);

我不知道问题是什么,但答案是 yes,它是一个有效的候选者,如果将它分成两个语句,它就可以工作:

ThrowingFunction<String, URL, MalformedURLException> ctor = URL::new;
final URL url = unchecked(ctor).apply("http://www.examples.com");