如何为任何类型的可比较对象实现compareTo

时间:2019-07-16 19:08:08

标签: java object interface comparable compareto

我不知道如何比较2个可比较的对象而没有其他变量告诉我哪个更大。问题是:创建一个名为Max的类,该类提供一个称为max的类方法。 max对可以比较的对象采用两个参数,即,实现了上面所示的Java Comparable接口。它返回对较大者的引用。如果两个对象相等,则应返回第一个。可比性的实现方式取决于每个类,并且您的方法将在多种不同的对象上调用。

它在界面中提供了int compareTo(其他对象)方法,但是我在寻找解决方案时遇到了困难。

public class Max implements Comparable 
{
    public int compareTo(Object other)
    {

    }

    public static Comparable max(Comparable first, Comparable second)
    {
        int fi = first.compareTo(second);
        if(fi >0)
            return first;
        else if (fi<0)
            return second;
        return first; 
    }
}
  

java.lang.AssertionError:类不应实现Comparable:预期[false]但找到[true]

那是错误之一。但是我也需要编写compareTo方法的帮助。

2 个答案:

答案 0 :(得分:0)

我删除了之前的答案,因为我想,恕我直言,您已经使这一问题变得复杂了。由于max的两个参数已经实现了Comparable<T>接口,因此您所要做的就是将其称为:

int ret = first.compareTo(second);

然后根据ret的值像您一样先返回第一个或第二个。这样,您无需了解其实现方式。也许您可以从您的老师或从事此工作的其他人那里得到一些澄清(我想这是为一项作业)。

创建一些实现该接口的测试类对您来说是值得的。您可以组成一些代表大小的变量。

答案 1 :(得分:0)

您的问题的关键字是泛型。您可能需要做一些研究并阅读一些相关内容。看下面的例子。为了简化起见,我将Max类实现为静态类:

import java.time.LocalDate;

public class MyTestClass{ 
    public static void main(String args[]) {
        Integer i = 16;
        Integer j = 15;
        Integer m = Max.max(i, j);
        System.out.println(m);
        String k = "aaaa";
        String n = "zzzz";
        String s = Max.max(k, n);
        System.out.println(s);
        LocalDate d = LocalDate.now();
        LocalDate e = LocalDate.now().plusDays(2);
        LocalDate f = Max.max(d , e);
        System.out.println(f);
    }
    static class Max{
        public static <T extends Comparable> T max(T first, T second) {            
            if (first.compareTo(second) >= 0)
                return first;
            else
                return second;
        }
    }
}

如您所见,存在一个具有单个方法max的Max类,该方法接受两个对象,例如两个整数,两个字符串或两个日期对象。

由于所有这些类都实现了可比较的接口,因此可以对所有对象类型使用max方法。然后,编译器在运行时决定要调用哪个comapreTo方法,即Integer,String,LocalDate类或其他类的compareTo。