2016-10-06 10 views
1

Я пытаюсь сортировать List<Point2D> точек с помощью Collections.sort(). Я считаю, что правильно настроил этот компаратор. В любом случае, это вызывает ошибку: The method sort(List<T>, Comparator<? superT>) in the type Collections is not applicable for the arguments (List<Point2D>, new Comparator<Point2D.Double>(){}). Кто-нибудь понимает, почему мой компилятор бросает эту ошибку?Point2D Comparator, указав ошибку

Collections.sort(points, new Comparator<Point2D.Double>() { 
    public int compare(Point2D.Double p1, Point2D.Double p2) { 
     return Double.compare(p1.getX(), p2.getX()); 
    } 
}); 
+0

Если у вас есть список 'Point2D', то вам нужно компаратор для' Point2D'. В настоящее время у вас есть компаратор для «Point2D.Double», который не то же самое. – Turamarth

ответ

2

просто удалить .Double, ваш Comparator должны быть одного типа (или родителя типа) вашего List.

Collections.sort(points, new Comparator<Point2D>() { 
     public int compare(Point2D p1, Point2D p2) { 
      return Double.compare(p1.getX(), p2.getX()); 
     } 
    }); 
+0

«Тот же тип», означающий супер-тип, также действителен. – MordechayS

+0

да супер тип также действителен не подтип, Point2D.Double является подтипом Point2D –

+0

Я не исправлял вас, просто указав, что из ... :) – MordechayS

0

Из Java documentation из Collections, мы можем видеть, что в методе sort(List<T> list, Comparator<? super T> c), если List имеет T то Comparator может быть типа T или его родительских классов (в том числе самого Т).

В вашем случае, у вас есть List<Point2D> & Comparator<Point2D.Double> и Point2D.Double не родительский класс Point2D.

Относительно <? super T> см. this link.

Измените код следующим образом:

List<Point2D> points = new ArrayList<Point2D>(); 
Collections.sort(points, new Comparator<Point2D>() { 
    public int compare(Point2D p1, Point2D p2) { 
     return Double.compare(p1.getX(), p2.getX()); 
    } 
});