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

时间:2018-10-16 08:51:01

标签: generics lambda java-8 type-inference method-reference

我有一个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
}

这里的问题是,如果我将方法引用T传递到R静态实用程序中,为什么编译器不会推断类型参数URL::newunchecked方法?

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

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

2 个答案:

答案 0 :(得分:3)

您是正确的,它应该可以工作,这很可能与您正在使用方法引用以及编译器在某种程度上变得令人困惑的事实有关,有两种解决方案:

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


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

答案 1 :(得分:2)

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

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