Сделайте себе одолжение: каждый раз, когда вы переопределяете метод, добавляйте к нему аннотацию @Override
. Это даст вам ошибку компиляции, если вы допустите ошибку при переопределении метода, что и происходит здесь. Вы неправильно его реализуете, поскольку Comparable
(«необработанная» форма Comparable<T>
не объявляет метод compareTo(String)
, она объявляет метод compareTo(Object)
.
Чтобы компилировать его как есть, вам нужно будет принять Object
вместо String
или реализовать Comparable<String>
вместо Comparable
.
Но это действительно было бы неправильно в большинстве случаев, потому что такое сравнение не симметрично: вы можете сравнить слово со строкой, а не строку со словом.
Скорее всего, вы хотите реализовать Comparable<Word>
вместо Comparable
и принять от Word
до compareTo()
.
@Override
public int compareTo(Word other)
{
String temp = other.word;
//...
}
Обратите внимание, что Comparable
действительно очень хорошо подходит, когда тип изначально упорядочен (то, что документы называют "естественным порядком"), например, даты или числа. Поскольку вы на самом деле не сравниваете два слова в алфавитном порядке (что было бы наиболее близко к естественному порядку строки), это лучший вариант для использования внешнего компаратора .
//since Word.word is a private member, this either needs to be nested inside of Word
//or Word.word would need to be given an accessor method
public static class LengthComparator implements Comparator<Word> {
@Override
public int compare(Word word1, Word word2) {
return Integer.valueOf(word1.word.length()).compareTo(word2.word.length());
}
}