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");