我有一个ThrowingFunction<T, R, E extends Exception>
具有具有此签名的单个抽象方法的功能接口(interface):R apply(T t) throws E
.
我在功能接口(interface)中有一个静态实用方法,允许用户转换 ThrowingFunction<T, R, E extends Exception>
实例进入Function<T, R>
实例:
static <T, R> Function<T, R> unchecked (final ThrowingFunction<T, R, ?> tf)
{
// code here
}
这里的问题是为什么类型参数 T
和R
如果我传递方法引用 URL::new
,编译器不会推断出进入unchecked
静态实用方法?
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);
关于generics - Java 8 [无法推断类型变量]问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52831525/