加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么我需要在映射到Callable时明确给出类型参数?

发布时间:2020-12-15 00:40:31 所属栏目:Java 来源:网络整理
导读:当我试图回答一个不同的问题时,我发现只有在我明确给出类型参数时我的代码才会编译(无论代码计算的是什么都没有意义,我知道): public Double calculateResult(int value) { return 0.0d;}private void init2() { ListCallableDouble list = IntStream.range
当我试图回答一个不同的问题时,我发现只有在我明确给出类型参数时我的代码才会编译(无论代码计算的是什么都没有意义,我知道):
public Double calculateResult(int value) {
    return 0.0d;
}

private void init2() {
    List<Callable<Double>> list = IntStream.range(1,99)
            .<Callable<Double>>mapToObj(value -> (() -> calculateResult(value)))
            .collect(Collectors.toList());
}

删除类型参数时< Callable< Double>>从mapToObj,它不编译,并给出错误

cannot infer the type variable by itself

如果我改变它以使用供应商< Double>它也不能推断出论据.或DoubleSupplier.

为什么它不能推断类型参数?

更新,我正在使用Netbeans 8.0进行编译,尚未使用javac编译器进行检查.

解决方法

这是我对正在发生的事情的理解.

问题是您希望编译器使用预期的赋值类型(在本例中为List< Callable< Double>>)来推断类型参数.但是,.mapToObj不是链中的最后一个语句,它不返回List.

下面的代码可以工作,因为这里编译器可以将.mapToObj调用的结果与您声明为返回类型的结果相匹配,因此它可以推断出流的类型参数.

Stream<Callable<Double>> temporaryVariable = IntStream.range(1,99)
    .mapToObj(value -> (() -> calculateResult(value)));
List<Callable<Double>> list = temporaryVariable.collect(Collectors.toList());

因为它不是链中的最后一个语句,如果我是编译器,我真的不想通过Stream<?>的所有可能值. (基本上是.mapToObj的返回类型)找到一个与下一个调用匹配的调用,返回List< Callable< Double>>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读