在界面中实现Comparable

时间:2010-10-17 20:37:43

标签: java interface comparable

我只使用其接口调用特定的类。问题是,类本身实现了Comparable,但由于我通过不同的接口引用该类,因此编译器不知道它实现了Comparable。我确信有一个简单的解决方案......但我现在想不到它。

5 个答案:

答案 0 :(得分:8)

实现接口的所有是否也会实现Comparable<T>?如果是这样,我建议您只使界面扩展Comparable<T>

否则,如果你碰巧知道在这个的情况下它会起作用,你可以转换为Comparable<T>。当然,这会失去一些编译时类型的安全性,但这就是野兽的本质。

答案 1 :(得分:1)

这对我来说似乎很奇怪...如果你有像下面这样的主要内容,你可以使用下面的Parent接口和子类...但是有一个奇怪之处在于你可以尝试将ChildA与一个可能没有意义的ChildB。

也许如果你给我们一个关于类/接口正在做什么的提示,我们可以给出更好的答案。

public class Main
{
    public static void main(final String[] argv)
    {
        Parent x;
        Parent y;

        x = new ChildA();
        y = new ChildA();
        x.compareTo(y);
    }
}

abstract interface Parent
    extends Comparable<Parent>
{
}

class ChildA
    implements Parent
{
    public int compareTo(Parent o)
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

class ChildB
    implements Parent
{
    public int compareTo(Parent o)
    {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

答案 2 :(得分:1)

我建议你改用Comapartor。您可以使用sort(list,Comparator)。您的比较器实现将类转换为Comparable并使用其compare方法。因此编译器将得到满足,您将重用比较方法的现有实现。

答案 3 :(得分:1)

你可以做一些怪异的泛型。假设主界面是Lickable(定义方法lick()),您需要一个处理LickableComparable对象的方法。你写道:

public <LickableAndComparable extends Lickable & Comparable<LickableAndComparable>> void lickGreater(LickableAndComparable a, LickableAndComparable b) {
    if (a.compareTo(b) > 0) a.lick();
    else b.lick();
}

然后,您可以使用LickableComparable的任何类型的对象调用它。请注意,只有当两个参数共享一个同时为LickableComparable的类型时,它才有效。如果你只考虑一个班级,那么这应该没问题。如果您对方法的使用变得复杂,则可能会遇到偏头痛诱导编译器错误。

答案 4 :(得分:0)

可比较的接口很棘手。通常,如果将接口标记为自身可比较,则任何正确的实现都只能使用此接口中的方法来执行比较。否则,这种关系不能反对称 - 这是一致排序的必要条件。

在将界面标记为可比较之前,请三思而后行。

如果你确定没有混合不同的界面实现,那么你的情况就有一种解决方法:

interface Foo {
}

interface Bar extends Foo, Comparable<Bar> {
}


class FooComparator<T extends Foo & Comparable<T>> implements Comparator<T> {

    @Override
    public int compare(T arg0, T arg1) {
        return arg0.compareTo(arg1);
    }
}