import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;`
我在Java8中遇到了这个错误(在Eclipse Oxygen中):
List<Integer> nums = Arrays.asList(1,2,3);
IntSummaryStatistics stats2 = nums.stream().collect(Collectors.summarizingInt(x->x));`
System.out.println(stats2);// Works!
现在我没有使用stats2,而是直接将整个RHS传递给println:
System.out.println(nums.stream().collect(Collectors.summarizingInt(x->x)));// Compile Error
错误:方法println(char)对于PrintStream类型
是不明确的
但是,如果我添加一个toString(),它就可以工作。
System.out.println(nums.stream().collect(Collectors.summarizingInt(x->x)).toString());
所以我想知道它为什么会这样!
通常当我们将对象传递给System.out.println()
时,它的toString()
方法将被调用(内部)。那么为什么我需要显式调用toString()方法?
通常我们也可以将RHS替换为另一种方法,例如:
double x = Math.sqrt(5);
System.out.println(x); // works
System.out.println(Math.sqrt(5)); //RHS substitution works
理解这一点的任何帮助都会很棒。
添加了确切的代码。
package java8.examples;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;
public class SampleProblem {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1,2,3);
IntSummaryStatistics stats = nums.stream().collect(Collectors.summarizingInt(x->x));
System.out.println(stats);
System.out.println(nums.stream().collect(Collectors.summarizingInt(x->x))); //Produces compile error
}
}
答案 0 :(得分:0)
它看起来像是一个Eclipse问题。 Eclipse Oxygen有一个开放的错误警告方法中的这种模糊性。 https://bugs.eclipse.org/bugs/show_bug.cgi?id=527083
在您的情况下,一种解决方法,它将通过强制转换来解决:
System.out.println((IntSummaryStatistics)nums.stream().collect(Collectors.summarizingInt(x->x)));