Похоже, вы пытаетесь сравнить два двойных :
contours.sort(Comparator.comparingDouble(a -> ImgProc.contourArea((MatOfPoint) a));
Состав также немного сомнителен: если вы на самом деле не пытаетесь отсортировать список Object
, используйте тип элемента. Предполагая, что contours
является List<? extends Mat>
:
contours.sort(Comparator.comparingDouble(ImgProc::contourArea));
Конкретная проблема, с которой вы, вероятно, столкнулись, связана с транзитивностью: если a == b
и b == c
, то для контракта компаратора также требуется a == c
. (Здесь x == y
означает compare(x, y) == 0
).
Но из-за сужения от double до int это требование нарушается. Рассмотрим a = 0
, b = 0.5
, c = 1
: int(b - a) == 0
и int(c - b) == 0
, поэтому "a == b
" и "b == c
".
Однако, int(c - a) == 1
, поэтому "a != c
". Таким образом, договор нарушен.