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
,编译器不会推断出类型参数 T
和 R
静态实用方法 ?
final URL url = unchecked(URL::new).apply("http://www.examples.com");
我的意思是,URL::new
不是 ThrowingFunction<String, URL, MalformedURLException>
的有效候选人,因此 T
和 R
应该推断为 String
和 URL
分别是?
你是对的,它应该可以工作,这很可能与你正在使用方法引用这一事实有关,而编译器不知何故变得混乱,有两种解决方案:
// 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");
我有一个 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
,编译器不会推断出类型参数 T
和 R
静态实用方法 ?
final URL url = unchecked(URL::new).apply("http://www.examples.com");
我的意思是,URL::new
不是 ThrowingFunction<String, URL, MalformedURLException>
的有效候选人,因此 T
和 R
应该推断为 String
和 URL
分别是?
你是对的,它应该可以工作,这很可能与你正在使用方法引用这一事实有关,而编译器不知何故变得混乱,有两种解决方案:
// 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");