Компилятор знает, что Comparator.comparingInt(String::length)
возвращает Comparator<String>
(поскольку вы передаете ему ToIntFunction<String>
), и поэтому ожидает, что второй Comparator
, переданный в thenComparing
, будет Comparator<String>
,поэтому он может вывести тип Comparator
, возвращаемый Comparator.naturalOrder()
, как Comparator<String>
.
С другой стороны, когда первый Comparator
возвращается Comparator.naturalOrder()
(который возвращаетComparator<T>
), компилятор не знает, какой тип Comparator
ожидать для аргумента thenComparing
, поэтому он отклоняет переданный ему Comparator<String>
.
Этой ошибки можно избежать, еслиВы объявляете тип Comparator
, возвращенный Comparator.naturalOrder()
явно:
Comparator<String> comp = Comparator.naturalOrder();
listOfStrings.stream()
.sorted(comp.thenComparing(Comparator.comparingInt(String::length)))
.forEach(System.out::println);