我只使用它的接口调用一个特定的类。问题是,类本身实现了 Comparable,但是因为我通过不同的接口引用该类,编译器不知道它实现了 Comparable。我确信有一个简单的解决方案......但我现在想不出。
5 回答
实现接口的所有东西都会实现Comparable<T>
吗?如果是这样,我建议你只是让接口 extend Comparable<T>
。
Comparable<T>
否则,如果您碰巧知道在这种情况下它会起作用,您可以直接转换为。当然,这会失去一些编译时类型的安全性,但这是野兽的本性。
我建议您改用 Comapartor。您可以使用排序(列表,比较器)。您的比较器实现会将类转换为 Comparable 并使用其比较方法。所以编译器会满意,您将重用 compare 方法的现有实现。
你可以做一些怪异的泛型。假设主接口是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();
}
然后,您可以使用任何类型的对象来调用它,这两者都是Lickable
和Comparable
。请注意,它仅在两个参数共享一个既属于Lickable
又Comparable
属于自己的类型时才有效。如果您只考虑一门课,那么这应该没问题。如果您对该方法的使用变得复杂,您可能会遇到导致偏头痛的编译器错误。
这对我来说似乎很奇怪......如果你有如下的 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.");
}
}
可比较的接口很棘手。一般来说,如果您将一个接口标记为与自身可比较,则任何正确的实现都只能使用该接口中的方法来执行比较。否则,这种关系不能反对称 - 具有一致排序的必要条件。
因此,在将接口标记为可比之前请三思。
但是,如果您确定没有混合接口的不同实现,则在您的情况下有一种解决方法:
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);
}
}