2014-11-21 2 views
-1

Я пытаюсь реализовать двоичное дерево поиска, только ради обучения, и я хочу, чтобы дерево было общим. Это код, который я до сих пор (очень ограничено):Непроверенный вызов 'compareTo (T)'

package lect1; 

public class BinNode { 
    Comparable element; 
    BinNode left; 
    BinNode right; 

    public BinNode find(Comparable obj) { 
     if (element == null) { 
      return null; 
     } else if (obj.compareTo(left.element) < 0) { 
      left.find(obj); 
     } else if(obj.compareTo(right.element) > 0) { 
      right.find(obj); 
     } else { 
      return this; 
     } 
     return null; 
    } 

    public void insert(Comparable obj) { 

    } 
} 

Однако я получаю сообщение об ошибке Unchecked вызов «CompareTo (T)» в качестве члена сырого типа «java.lang.Comparable». Может ли кто-нибудь из вас пролить свет на то, как я это разрешу.

+2

http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it –

ответ

1

Comparable<T> - общий тип, но вы используете тип, теряя безопасность. Вы, вероятно, хотите, чтобы ваш BinNode родовой тоже в своем роде элемент:

public class BinNode<T extends Comparable<T>> { 
    private T element; 
    private BinNode<T> left; 
    private BinNode<T> right; 

    public BinNode<T> find(T obj) { 
     // TODO: Handle the cases where left or right is null 
     if (element == null) { 
      return null; 
     } else if (obj.compareTo(left.element) < 0) { 
      return left.find(obj); 
     } else if (obj.compareTo(right.element) > 0) { 
      return right.find(obj); 
     } else { 
      return this; 
     } 
    } 

    public void insert(T obj) { 

    } 
} 

Ограничение на T то гарантирует, что элементы будут сопоставимы друг с другом.

Обратите внимание, что я также исправил вашу рекурсию - ранее вы звонили left.find() или right.find(), но игнорировали возвращаемое значение.

Смежные вопросы