字符串不被视为对象吗?

时间:2012-02-27 01:14:42

标签: java interface

我不明白为什么当一个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 个答案:

答案 0 :(得分:7)

当然String是一个Object。

可比较现在是通用的。如果它们是String类型,为什么你觉得需要创建那些引用Object?你的代码很差;这不是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; }
}

答案 1 :(得分:4)

问题在于DataSet实施Comparable,但Object没有。{/ p>

您希望存储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;  
 }  
}  

编辑 - 只是看到你在比较字符串。在这种情况下,您实际上不需要DataSet来实施Comparable。但是,如果你确实需要别的东西,我写的东西仍然存在。

答案 2 :(得分:3)

最小和最大只是对象,而Object类没有compareTo(...)方法,就这么简单。最小和最大需要声明Comparable,而不是Object。如上所述,声明DataSet实现Comparable接口是没有意义的,因为没有DataSet对象,当然也没有比较。

答案 3 :(得分:2)

java.lang.Object没有compareTo()方法。

答案 4 :(得分:0)

首先,代码中存在无限循环:

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

这种方法不断呼唤自己。

关于编译错误:您已将变量声明为Object,显然没有compareTo方法。

答案 5 :(得分:0)

Object中没有compareTo()方法。我想你正在寻找String.compareTo()

答案 6 :(得分:0)

类型检查在编译时完成,而不是运行时。在编译时,最小值和最大值被认为是Object类型的对象而不是String。