当前位置: 首页 > 知识库问答 >
问题:

赋值--使泛型类和实现具有可比性(Java)

穆睿才
2023-03-14

我必须制作一个使用Java泛型的程序,并实现可比。代码基本上应该比较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)中,但我不明白如何将当前对象与传入的对象进行比较。

我也不知道用“int age”变量做什么,它不能让我比较int和Person对象。

共有1个答案

侯焱
2023-03-14

是的。这会导致堆栈溢出。在compareTo函数中有无限的递归,反复调用自己。

compareTo函数应该返回一个int,该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;
 类似资料:
  • 我试图约束泛型函数的返回类型。(为了简化示例,请忽略函数的实际“有用性”)。 但是返回语句会导致打字错误- -这让我很困惑。在我的理解中,

  • 它是关于java中具有两种泛型类型(一种用于返回类型,另一种用于形式参数)的泛型方法以及如何实现它。我想我在图片中缺少一些东西来让它工作。 事情是这样的... 这是工作 : 这不起作用: java编译器告诉我: 好吧,就是这样。提前感谢大家!希望它能在未来帮助别人! P、 D:这不是枚举类型的问题。它发生在类和层次结构之间。所以别怪Enum了,我试过了,但没用。 对于泛型参数 我们可以做一个一般规

  • 问题内容: 我试图实现一个排序和未排序的数组列表。两者都扩展了一个名为AbstractArrayMyList的类,其中包含常见的操作/实现- toString,clear等。 这是我的AbstractArrayMyList代码(它实现了我定义的通用接口) 我选择对elementData进行保护,以便可以对已排序和未排序的专用数组列表进行访问并对其执行操作。这是我的排序数组列表的声明/代码 所有这些

  • 问题内容: 所以我有一张地图: 我会像这样添加元素: 我有如下通用方法: 现在,这段代码可以很好地工作,并且没有编译器问题: 但是,当我尝试这样做时: 编译器向我显示以下警告:类型安全:通用方法verifyType(String,Class)的未经检查的调用verifyType(String,Class) 这让我感到困惑…请帮助… 问题答案: 更改: 至 通过仅将类型声明为“ Class”,就失去

  • 我试图编写一个函数来返回

  • 问题内容: 还有其他一些SO问题在讨论可以使用Eclipse的编译器而不是javac进行泛型编译的问题(即Java:泛型在Eclipse和javac中处理不同,而泛型可以在Eclipse中编译和运行,但不能在javac中编译)-但这看起来就像一个稍微不同的人。 我有一堂课: 我还有一个带有方法的类,该方法接受来自以下类型的任意对象: 这在Eclipse中可以正常工作,但是当我使用进行了干净的构建时