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