Строка не считается объектом? - PullRequest
2 голосов
/ 27 февраля 2012

Чего я не понимаю, так это того, почему я получаю ошибку при компиляции моего кода, когда String фактически является объектом, а компилятор говорит иначе.Я не знаю, почему я продолжаю получать это сообщение об ошибке

  symbol:   method compareTo(Object)
  location: variable least of type Object
.\DataSet.java:17: error: cannot find symbol
   else if(maximum.compareTo(x) < 0)

вот код.Я пытаюсь использовать сопоставимый класс, чтобы два объекта могли использовать метод CompareTo.В тестере я просто пытаюсь использовать базовый строковый объект для сравнения.

public class DataSetTester
{
public static void main(String[] args)
{
    DataSet ds = new DataSet();
    String man = "dog";
    String woman = "cat";
    ds.add(man);
    ds.add(woman);
    System.out.println("Maximum Word: " + ds.getMaximum());


 }
}

Класс:

public class DataSet implements Comparable 
{
 private Object maximum;
 private Object least;
 private int count;
 private int answer;

 public void add(Object x)
 {

   if(count == 0){
     least = x;
     maximum = x;
   }
   else if(least.compareTo(x) > 0)
     least = x;
   else if(maximum.compareTo(x) < 0)
    maximum = x;
   count++;
 }

 public int compareTo(Object anObject)
 {
     return this.compareTo(anObject);
 }

 public Object getMaximum()
 {
  return maximum;
 }

 public Object getLeast()
 {
   return least;
 }
}

Сопоставимый интерфейс:

public interface Comparable
{
    public int compareTo(Object anObject);
}

Ответы [ 7 ]

7 голосов
/ 27 февраля 2012

Конечно, String - это объект.

Comparable теперь является общим.Почему вы чувствуете необходимость сделать эти ссылки объектными, если они имеют тип String?Ваш код плохой;это не проблема Java.

Я не понимаю, почему DataSet должен реализовывать Comparable.Вам просто нужно сравнить входящие строки по мере их добавления.Сделай это так, и ты будешь лучше:

public class DataSet {
    private String maximum;
    private String least;
    private int count;
    private int answer;

    public void add(String x) {  
        if(count == 0){
             least = x;
             maximum = x;
        } else if (least.compareTo(x) > 0) {
             least = x;
        } else if(maximum.compareTo(x) < 0) {
             maximum = x;
        }
        count++;
    }

    public String getMaximum() { return this.maximum; }

    public String getLeast() { return this.least; }

    public int getCount() { return this.count; }
}
4 голосов
/ 27 февраля 2012

Проблема в том, что DataSet реализует Comparable, а Object - нет.

Вместо хранения Object с, вы хотите сохранить Comparable с.Однако, если вы получите это для компиляции, вы попадете в бесконечный цикл прямо здесь:

public int compareTo(Object anObject) 
{
    // Yeah, never stop loopin'!
    return this.compareTo(anObject);
}

Рекомендуется, чтобы в более новом коде вы использовали общий интерфейс Comparable<T>.Ваш код будет выглядеть следующим образом:

public class DataSet implements Comparable<DataSet>  
{  
 private String maximum;  
 private String least;  
 private int count;  
 private int answer;  

 public void add(String x)  
 {  

   if(count == 0){  
     least = x;  
     maximum = x;  
   }  
   else if(least.compareTo(x) > 0)  
     least = x;  
   else if(maximum.compareTo(x) < 0)  
    maximum = x;  
   count++;  
 }  

 public int compareTo(DataSet anObject)  
 {  
     // I don't really know how you want this to work.
     // Come up with your own criteria on what makes a DataSet greater or less than
     // another one.
     count - anObject.count
 }  

 // Good practice to include this if you're doing a compareTo.
 @Override
 public boolean equals(Object other)
 {
     return (other instanceof DataSet) && compareTo((DataSet)other) == 0;
 }

 public String getMaximum()  
 {  
  return maximum;  
 }  

 public String getLeast()  
 {  
   return least;  
 }  
}  

Edit - только что увидел, что вы сравниваете строки.В этом случае вам не нужно DataSet для реализации Comparable.Однако, если вам это нужно для чего-то другого, то, что я написал, остается в силе.

3 голосов
/ 27 февраля 2012

наименьший и максимальный - просто Objects, и у класса Object нет простого метода compareTo(...). минимум и максимум должны быть объявлены Comparable, а не Object. И, как написано, нет смысла объявлять DataSet для реализации интерфейса Comparable, так как нет никаких объектов DataSet и, конечно, ни одного сравниваемого.

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

java.lang.Object не имеет метода compareTo ().

0 голосов
/ 27 февраля 2012

Проверка типов выполняется во время компиляции, а не во время выполнения.Во время компиляции наименьшее и максимальное считаются объектами типа Object, а не String.

0 голосов
/ 27 февраля 2012

В Object нет метода compareTo (). Я думаю, вы ищете String.compareTo () .

0 голосов
/ 27 февраля 2012

Прежде всего в вашем коде есть бесконечный цикл:

 public int compareTo(Object anObject)
 {
     return this.compareTo(anObject);
 }

этот метод постоянно вызывает сам себя.

Относительно вашей ошибки компиляции: вы объявили переменную как Object, которая, очевидно, не имеет метода CompareTo.

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