当我试图回答一个不同的问题时,我发现只有在我明确给出类型参数时我的代码才会编译(无论代码计算的是什么都没有意义,我知道):
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>>.
原文地址:https://www.jb51.cc/java/129432.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。