5

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

4

5 回答 5

8

实现接口的所有东西都会实现Comparable<T>吗?如果是这样,我建议你只是让接口 extend Comparable<T>

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

于 2010-10-17T20:39:34.040 回答
1

我建议您改用 Comapartor。您可以使用排序(列表,比较器)。您的比较器实现会将类转换为 Comparable 并使用其比较方法。所以编译器会满意,您将重用 compare 方法的现有实现。

于 2010-10-17T21:22:53.217 回答
1

你可以做一些怪异的泛型。假设主接口是Lickable(它定义了一个方法lick()),并且您想要一个方法来处理Lickable和的对象Comparable。你写:

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

然后,您可以使用任何类型的对象来调用它,这两者都是LickableComparable。请注意,它仅在两个参数共享一个既属于LickableComparable属于自己的类型时才有效。如果您只考虑一门课,那么这应该没问题。如果您对该方法的使用变得复杂,您可能会遇到导致偏头痛的编译器错误。

于 2010-10-17T21:58:17.703 回答
1

这对我来说似乎很奇怪......如果你有如下的 main ,你可以使它与下面的 Parent 接口和 Child 类一起工作......但奇怪的是你可以尝试将 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.");
    }
}
于 2010-10-17T20:57:08.417 回答
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);
    }
}
于 2012-10-28T12:06:48.600 回答