Есть ли способ реализовать метод CompareTo, который бы сравнивал любой предоставленный аргумент? - PullRequest
2 голосов
/ 31 марта 2012

Компилятор говорит: «не удается найти символ: метод compareTo (java.lang.Object)». Подскажите, пожалуйста, в чем здесь ошибка?

Вот часть кода:

public class OBTComparable<ObjectType> implements Comparable<OBTComparable>
{
    public OTBComparable leftNode = null;
    public OBTComparable mainNode = null;
    public OBTComparable rightNode = null;
    public ObjectType object = null;

    public OBTComparable(ObjectType requiredObject)
    {
        object = requiredObject;
    }

    @Override
    public int compareTo(OBTComparable other)
    {
        if(object.compareTo(other.object) == 0)
            return 0;
        else 
            if (object.compareTo(other.object) > 0)
                return 1;
            else return -1;
    }
}

Ответы [ 3 ]

4 голосов
/ 31 марта 2012

Вам также необходимо указать диапазон ObjectType до Comparable, поскольку OBTComparable означает делегирование compareTo() на ObjectType:

Если вы измените <ObjectType> на <ObjectType extends Comparable<ObjectType>>, скомпилирует:

public class OBTComparable<ObjectType extends Comparable<ObjectType>> implements Comparable<OBTComparable>
3 голосов
/ 31 марта 2012

Я думаю, что это правильный код, который вы ищете (я заменил ObjectType на T для ясности):

class OBTComparable<T extends Comparable<? super T>> implements Comparable<OBTComparable<T>> {
    public OBTComparable<T> leftNode = null;
    public OBTComparable<T> mainNode = null;
    public OBTComparable<T> rightNode = null;
    public T object = null;

    public OBTComparable(T requiredObject) {
        object = requiredObject;
    }

    @Override
    public int compareTo(OBTComparable<T> other) {
        if (object.compareTo(other.object) == 0) {
            return 0;
        } else if (object.compareTo(other.object) > 0) {
            return 1;
        } else return -1;
    }
}

Что я изменил здесь:

  1. OBTComparable использует параметр типа, поэтому вы должны показать его при реализации Comparable. Поэтому у вас есть implements Comparable<OBTComparable<T>> вместо простого implements Comparable<OBTComparable>.
  2. Вы сравниваете два объекта в методе compareTo, но сопоставимы ли они? Чтобы убедиться, что это требование выполнено, вы должны написать OBTComparable<T extends Comparable<T>> вместо OBTComparable<T>. Тогда вы узнаете, что можете позвонить compareTo.
2 голосов
/ 31 марта 2012

ObjectType также должен реализовывать Comparable<ObjectType>.

И если вы сделаете это, я считаю, что это:

public int compareTo(OBTComparable other)
{
    if(object.compareTo(other.object) == 0)
        return 0;
    else 
        if (object.compareTo(other.object) > 0)
            return 1;
        else return -1;
}

можно упростить до этого:

public int compareTo(OBTComparable other)
{
    return object.compareTo(other.object);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...