我必须使用Java泛型进行编程,并实现Comparable。代码应该基本上比较3个人的年龄,并告诉你真或假。
我们必须在课堂中加入“int age”变量。
这就是我所做的:
@SuppressWarnings("rawtypes")
public class Person implements Comparable<Person>{
int age;
//He said you should have ("int age"), but I dont know how to do this without using generics?
public Person(int age)
{
this.age = age;
}
public int compareTo(Person o) {
return compareTo(o);
}
}
我的比较课程:
public class OrderedTrio<T> {
@SuppressWarnings("unused")
public static void main(String[] args)
{
//Create Person object
Person personA = new Person(10);
Person personB = new Person(20);
Person personC = new Person(30);
System.out.println(allEqual(personA, personB, personC));
//Create Employee object
}
//All Equal Method: Returns true if all 3 items are equal according to their equals method
public static boolean allEqual(Person personA, Person personB, Person personC)
{
if(personA.compareTo(personB) ==0 && personB.compareTo(personC)==0) //If A=B, B=C then A=C
return true;
else
return false;
}
//Sort Method: Orders items
//ToString Method: Output format: Item1, 2, 3
}
当我运行这些时,我收到此错误: 线程“main”中的异常java.lang.StackOverflowError
我认为错误发生在 return compareTo(o)中,但我不明白如何将我的CURRENT对象与传入的对象进行比较。
我也不知道使用什么“int age”变量,它不会让我将int与Person对象进行比较。
答案 0 :(得分:3)
是的,这将导致堆栈溢出。你在compareTo函数中有无限递归,一遍又一遍地调用自己。
compareTo函数应返回一个int,表示与传入的对象相比,您希望赋予此对象的“值”。所以你说你想比较一个基于年龄的人,compareTo应该只根据年龄变量返回一个int,如下所示
compareTo(Person o){
//i'm younger
if (this.age < o.age)
return -1;
//i'm older
if (this.age > o.age)
return 1;
//same age
return 0;
}
现在,当您通过PersonA.compareTo(PersonB)比较两个人时,它应返回一个值,表明PersonA小于(-1)与(0)相同或大于(1)PersonB
此解决方案旨在显示您尝试执行的操作的一般概念,更有效的解决方案是从彼此中减去值并返回该值,例如
return age - o.age;
答案 1 :(得分:1)
您使方法compareTo
递归,但没有任何可能停止此递归。在compareTo
方法中,您必须添加一些将返回int
的条件,例如:
public int compareTo(Person o) {
return (age - o.age);
}
这样您就可以根据Person
字段比较两个age
个实例。您无法与整个实例之类的实例进行比较 - 它不是compareTo
的角色。您必须对将要比较这两个实例的条件做出一些假设,并且在这里,因为您只有一个字段age
,所以很好的假设是根据其年龄与Person
进行比较。
答案 2 :(得分:1)
public int compareTo(Person o) {
return age-o.age; // youngest first
// return o.age-age; // oldest first
}
另外,请阅读有关compareTo的文档。你似乎没有这样做。
答案 3 :(得分:1)
这是造成堆栈溢出错误的原因:
public int compareTo(Person o) {
return compareTo(o);
}
compareTo,调用compareTo,调用compareTo,调用....你得到了想法,它永远不会完成并返回。
整数值的简单比较类似于
public int compareTo(Person o) {
return age - o.age; //or to be java-y :
//Integer.valueOf(age).compareTo(Integer.valueOf(o.age));
//or Integer.signum(age - o.age);
//I personally don't trust people to use compareTo properly and not look for 1 or -1 :)
}
编辑:同样,压制rawtype警告非常顽皮。原始类型与泛型完全相反。如果您收到原始类型警告,那么您将明确地编写非通用代码!