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

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

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

这里的问题是为什么类型参数 TR如果我传递方法引用 URL::new ,编译器不会推断出进入unchecked静态实用方法?

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

我的意思是,不是 URL::new ThrowingFunction<String, URL, MalformedURLException> 的有效候选者因此TR应推断为 StringURL分别?

最佳答案

你是对的,它应该可以工作,这很可能与你使用方法引用而编译器不知何故感到困惑有关,有两种解决方案:

// 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/

相关文章:

c++ - C++14 中的 Lambda-Over-Lambda

c# - IQueryable 转换

javascript - Internet Explorer 中的 Lambda 表达式

java - Java并行流最有效的列表类型是什么?

java - 如何从列表中计算玩家的排名

java - 如何防止使用 Java 泛型检查根类?

java - 这里如何推断通用类型?

java - 如何在Java中克隆BlockingQueue?

c# - 将方法转换为 getter

使用模板的 C++ 链表