компаратор java <E> - PullRequest
       29

компаратор java <E>

0 голосов
/ 26 марта 2011

У меня следующий вопрос, у меня есть интерфейс, который требует, чтобы я возвратил java.util.Comparator <E>, мой вопрос, как я могу реализовать абстрактный класс, который каким-то образом возвращает универсальный компаратор.

Ответы [ 3 ]

1 голос
/ 26 марта 2011

К какому типу относится класс? Если бы у вас был один способ сделать это не абстрактно:

Для этого:

class Name {
  String name;   
}

Вы можете сделать это как один раз:

Comparator<Name> nameComparator = new Comparator<Name>() {
  public int compare(Name o1, Name o2) {
     return o1.name.compare(o2.name);
  } 

  public boolean equals(Object o) {
     return super.equals(o);
  }
}
1 голос
/ 26 марта 2011

Вы можете вернуть Comparator<?> и подавить предупреждения.

Имейте в виду, что дженерики существуют только во время компиляции, за исключением рефлексии. Ко времени выполнения JVM работает с необработанными классами. Итак, во время выполнения все Comparators относятся к одному типу. Поэтому, если вы отключите предупреждения и вернете Comparator, который просто сравнивает Object экземпляров, он будет работать так же, как и в Java 1.2.

0 голосов
/ 26 марта 2011

Я полагаю, что для интерфейса есть веская причина требовать от вас возврата Comparator Вы можете вернуть Comparator без параметра типа (который на самом деле не является универсальным ), но есть вероятность, что он где-нибудь сломается.

Что вы могли бы сделать:

Реализация универсального класса (=, который сам принимает параметр типа) и возвращает универсальный компаратор.

public MyImpl<E> implements SomeInterface {

...
   public Comparator<E> createComparator() {
      ...
   }

}

Игнорирование (подавление) предупреждений, хотя это может сработать в вашей ситуации, только в долгосрочной перспективе вызовет проблемы и, вероятно, не лучший путь.

...