我只使用其接口调用特定的类。问题是,类本身实现了Comparable,但由于我通过不同的接口引用该类,因此编译器不知道它实现了Comparable。我确信有一个简单的解决方案......但我现在想不到它。
答案 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()
),您需要一个处理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
的类型时,它才有效。如果你只考虑一个班级,那么这应该没问题。如果您对方法的使用变得复杂,则可能会遇到偏头痛诱导编译器错误。
答案 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);
}
}