Неверные типы операндов для двоичного оператора ">"? - PullRequest
3 голосов
/ 23 февраля 2012

Я пишу программу BST. Я получаю ошибку:

"Неверные типы операндов для бинарного оператора"> "

первый тип: java.lang.Object

второй тип: java.lang.Object "

Это метод, при котором выдается ошибка:

public void placeNodeInTree(TreeNode current, TreeNode t)                                                                    
{   
    if(current == null)
        current = t;
    else{
       if(current.getValue() > t.getValue()) 
            current.setRight(t);
       if(current.getValue() < t.getValue()) 
            current.setLeft(t);  
        }
}

getValue () имеет возвращаемый тип Object, то есть типы java.lang.Object. Это первый раз, когда я видел эту ошибку. Может ли кто-нибудь дать мне некоторые сведения об этой ошибке? Спасибо

Ответы [ 5 ]

6 голосов
/ 23 февраля 2012

Конечно - вы просто не можете применить оператор > между объектами. Что бы вы ожидали от этого? Вы также не можете применить другие бинарные операторы - +, -, / и т. Д. (За исключением конкатенации строк).

В идеале вы должны сделать свой TreeNode универсальный , и либо иметь Comparator<T>, который может сравнивать любые два экземпляра, либо сделать T extend Comparable<T>. В любом случае, вы можете сравнить их с:

int comparisonResult = comparator.compare(current.getValue(), t.getValue());
if (comparisonResult > 0) {
  // current "greater than" t
} else if (comparisonResult < 0) {
  // current "less than" t
} else {
  // Equal
}

или

int comparisonResult = current.getValue().compareTo(t.getValue());
// Code as before

Без дженериков вы могли бы привести значения к Comparable или по-прежнему использовать общий Comparator ... но дженерики были бы лучшей ставкой.

5 голосов
/ 23 февраля 2012

Java не поддерживает перегрузку операторов, поэтому оператор < не определен для непримитивных типов. Вы, вероятно, хотите использовать интерфейс Comparable<T>.

2 голосов
/ 23 февраля 2012

Вы не можете сравнивать два произвольных объекта с оператором >.Оператор > можно использовать (напрямую) только для целочисленных примитивных типов.

Вы можете создать объекты, которые вы хотите сравнить, реализуя интерфейс java.lang.Comparable, а затем вызвать для них метод compareTo для сравненияих.

Comparable left = (Comparable)current.getValue();
Comparable right = (Comparable)t.getValue();

if (left.compareTo(right) > 0)
    current.setRight(t);

// etc.
2 голосов
/ 23 февраля 2012

Вы не можете сравнивать объекты, используя > или <. Вам нужно сравнить их, используя какой-то метод, например compareTo (который вам нужно реализовать).

1 голос
/ 23 февраля 2012

Стандартная реализация equals заботится только о равенстве ссылок.Объект не знает, больше ли Cat, чем Apple, и не заботится.Вы должны предоставить конкретную реализацию, которая переопределяет как equals, так и hashcode, а также реализует интерфейс Comparable.Это позволит вам определить, действительно ли Cat больше Apple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...