Это ошибка в компиляторе Eclipse, и кроличья нора еще глубже, чем ошибка компилятора.Я сократил ваш пример кода до
public static void main(String[] args)
{
println(Stream.of(42).collect(Collectors.summingDouble(d -> d)));
}
public static void println(double x) {}
public static void println(char[] x) {}
public static void println(String x) {}
public static void println(Object x) {}
Я сохранил только методы println
, влияющие на поведение компилятора.
Есть методы println(Object x)
, которые являются теми, которыеследует вызывать, так как он является единственным применимым без операций бокса, println(double)
, который упомянут в сообщении об ошибке и применим после распаковки, и двумя методами println(char[] x)
и println(String x)
, которые не применимы ввсе.
Удаление метода println(double x)
устраняет ошибку, что было бы понятно, даже если ошибка не правильная, но странно, удаление метода println(Object x)
не не устранить ошибку.
и еще хуже , удалив или неприменимых методов, println(char[] x)
или println(String x)
, также удаляет ошибку, но генерирует код, вызывающий неправильный , неприменимый метод:
public static void main(String[] args)
{
println(Stream.of(42).collect(Collectors.summingDouble(d -> d)));
}
public static void println(double x) { System.out.println("println(double)"); }
public static void println(char[] x) { System.out.println("println(char[])"); }
//public static void println(String x) { System.out.println("println(String)"); }
public static void println(Object x) { System.out.println("println(Object)"); }
Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to [C
at Tmp2.main(Unknown Source)
public static void main(String[] args)
{
println(Stream.of(42).collect(Collectors.summingDouble(d -> d)));
}
public static void println(double x) { System.out.println("println(double)"); }
//public static void println(char[] x) { System.out.println("println(char[])"); }
public static void println(String x) { System.out.println("println(String)"); }
public static void println(Object x) { System.out.println("println(Object)"); }
Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
at Tmp2.main(Unknown Source)
Я думаю, нам не нужно копаться в глубине формальной спецификации языка Java,признать это поведениекак неуместное.
Удаление обоих неприменимых методов, println(char[] x)
и println(String x)
, заставляет компилятор выбрать правильный метод, println(Object x)
вместо println(double x)
, но это не впечатляет.
Для справки я тестировал версию Oxygen.3a Release (4.7.3a), сборка 20180405-1200.Возможно, затронуты и другие версии.