Generics Java 8[无法推断类型变量]问题
我有一个Generics Java 8[无法推断类型变量]问题,generics,lambda,java-8,type-inference,method-reference,Generics,Lambda,Java 8,Type Inference,Method Reference,我有一个ThrowingFunction函数接口,其中有一个抽象方法,具有以下签名:R apply(T)throwing E 我在功能界面中有一个静态实用程序方法,允许用户将ThrowingFunction实例转换为Function实例: static <T, R> Function<T, R> unchecked (final ThrowingFunction<T, R, ?> tf) { // code here } 我的意思是,URL::new
ThrowingFunction
函数接口,其中有一个抽象方法,具有以下签名:R apply(T)throwing E
我在功能界面中有一个静态实用程序方法,允许用户将ThrowingFunction
实例转换为Function
实例:
static <T, R> Function<T, R> unchecked (final ThrowingFunction<T, R, ?> tf)
{
// code here
}
我的意思是,
URL::new
不是throwing函数的有效条件吗,因此t
和R
应该分别推断为String
和URL
?你是对的,它应该工作,这很可能与您使用的是方法引用,而编译器不知何故感到困惑有关,有两种解决方案:
// a lambda
ThrowingFunction.unchecked((String x) -> new URL(x));
// an explicit cast
ThrowingFunction.unchecked((ThrowingFunction<String, URL, MalformedURLException>)URL::new);
//羔羊
未选中((字符串x)->新URL(x));
//明确的演员阵容
ThrowingFunction.unchecked((ThrowingFunction)URL::new);
我不知道问题是什么,但答案是是
,它是一个有效的候选者,如果你将它分成两条语句,它就会起作用:
ThrowingFunction<String, URL, MalformedURLException> ctor = URL::new;
final URL url = unchecked(ctor).apply("http://www.examples.com");
throwing函数ctor=URL::new;
最终URL=未选中(ctor)。应用(“http://www.examples.com");
如果拆分,所有类型都是已知的,并且是显式的,这与方法引用无法推断类型有关。答案对我来说似乎不错,我选择lambda方法,因为它在显式类型参数输入方面不太显式。问题是URL
有多个构造函数。您希望编译器根据预期的函数类型选择构造函数,同时需要知道实际的目标构造函数以确定函数类型。原则上,考虑arity已经足以确定正确的组合,但当前的Java语言没有做到这一点。因此,与此相反,URL=unchecked(URI::create)。然后(unchecked(URI::toURL)).apply(“http://www.examples.com");代码>将起作用,因为只有一个URI::create
方法…@Holger,当你认为我已经回答了一些关于这个的问题时非常感谢。
ThrowingFunction<String, URL, MalformedURLException> ctor = URL::new;
final URL url = unchecked(ctor).apply("http://www.examples.com");