这是我的主要结构: 一些接口方法在A类中实现,其余的都在子类中实现。
public interface I
{
// some methods
//
}
public abstract class A implements I
{
// some variables and methods
//
}
public class B extends A
{
// some variables and methods
//
}
public class C extends A
{
// some variables and methods
//
}
public abstract class D extends A
{
// some variables and methods
//
}
public class E extends D
{
// some variables and methods
//
}
public class Test
{
public static void main(String[] args)
{
ArrayList<I> la = new ArrayList<I>();
la.add(new B(..));
la.add(new C(..));
la.add(new C(..));
la.add(new B(..));
la.add(new E(..));
}
}
B,C和E类中有构造函数。
我需要按类A的变量对la
进行排序,变量是int数据类型。
我尝试改为
public abstract class A implements I, Comparable<A>
但由于在所有非抽象类中缺少public int compareTo(A o)
方法,我收到错误。
我需要做什么?
感谢。
答案 0 :(得分:0)
public abstract class A implements I, Comparable<A> {
// some variables and methods
@Override
public int compareTo(A o) {
return someVariable - o.someVariable;
}
}
您不需要A中的构造函数来实现compareTo
方法,并且您可以使用一些变量来进行比较。 compareTo
只是一种方法,因此您可以在A中使用方法,也可以使用compareTo
方法。由于我不知道你有什么可用的变量,也不知道你需要的排序顺序,你必须自己填写这个方法。
另一方面,在A中使用构造函数可能是一个好主意,但这是一个完全独立的问题。
编辑:我起初并没有想到这一点:你当然想要做
Collections.sort(la);
这并不像听起来那么简单。 Collections.sort()
是根据the docs声明的通用方法:
static <T extends Comparable<? super T>> void sort(List<T> list)
这意味着编译器对方法的调用感到高兴,列表的声明元素类型必须是对某些类型Comparable<U>
实现U
的元素类型,它是元素类型或者它的超类型。您的元素类型为I
,而I
未实现Comparable
。这就是您收到错误消息的原因。
解决方案?我不认为存在完美的解决方案。假设您不想声明la
ArrayList<A>
,另一个选项是声明I
具有可比性:
public interface I extends Comparable<I>
严格来说,这比我们能够实现的A
更有希望。我们可以比较两个A
对象(即使它们是A
的子类的实例),但可能还有I
的其他实现,我们可能不知道如何将它们与{ {1}}。一个出路是:
A
由于@Override
public int compareTo(I o) {
A oa = (A) o; // will throw ClassCastException if o is not an A
return someVariable - oa.someVariable;
}
延伸A
而I
延伸I
,我们现在必须声明Comparable<I>
o
,而不是{{1} }}。如果有人给我们一些外来I
实现,我们抛出一个A
,排序会将它传播给调用者。但是,我们知道在列表中所有元素都是I
的子类的实例,所以这不会发生。完成上述操作后,您对ClassCastException
的通话和对A
的通话都将有效。
答案 1 :(得分:0)
我通过添加来解决它
public interface I extends Comparable<I>
在A类中,我将方法compareTo
更改为
public int compareTo(I obj)
{
return someVariable - obj.someVariable;
}