2017-05-21 24 views
0

这是我的主要结构: 一些接口方法在类A中实现,其余的都在子类中实现。排序ArrayList对象的抽象类的子类的实例

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(..)); 
} 
} 

有在乙构造,C和E类。

我需要用类A的变量对la进行排序,变量是int数据类型。

我尝试改变

public abstract class A implements I, Comparable<A> 

但我得到,因为缺少在所有非抽象类public int compareTo(A o)方法的错误。

我需要做什么?

谢谢。

+0

如果某些东西缺少那么如何添加缺少实体的想法。 –

+0

你的类的对象排序是基于你的逻辑。 JVM不能为你自动定义它。你需要在某个地方定义它。如果你实现了Comparable接口,那么你需要在它的抽象方法'compareTo'的实现中定义比较逻辑,你必须提供方法的实现。添加它,实现比较的逻辑。可能要么你能解决问题,要么你会有更多*有意义的*和*特定*问题。 –

+1

所以我需要实现 public int compareTo(A o) in class A? – Asaf

回答

0
public abstract class A implements I, Comparable<A> { 
    // some variables and methods 

    @Override 
    public int compareTo(A o) { 
     return someVariable - o.someVariable; 
    } 
} 

你并不需要在没有构造函数来实现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。这就是为什么你会收到错误信息。

解决方案?我不认为存在完美的解决方案。假设你不想申报laArrayList<A>,另一个选择是声明I相媲美:

public interface I extends Comparable<I> 

严格地说,这是有希望的更多A比我们能完成。我们可以比较两个A对象(即使它们是A的子类的实例),但也可能有其他实现I,我们可能不知道如何将它们与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延伸II延伸Comparable<I>,我们现在必须声明o一个I,不是A。如果有人给我们一些外国实施,我们会抛出ClassCastException,并且排序会将其传播给调用者。但是,我们知道在您的列表中,所有元素都是A的子类的实例,所以这不会发生。如上所述,您拨打S.sortBySome()以及致电Collections.sort()都可以。

+0

我将这种方法添加到类A. 从主要的arraylist'la',我将它传递给包中​​另一个类的静态方法。 在主要方法中,我使用foreach通过某个变量按排序顺序打印所有实例。 '公共S类 { \t公共静态的ArrayList sortBySome(ArrayList的 LA) \t { \t} } ' 所以我添加此的方法: '\t \t ArrayList的 OBJ =新的ArrayList ( ); \t \t \t Collections.sort(la); ' 但我在排序方法上遇到错误。 '类型集合中的方法排序(列表)不适用于参数(ArrayList )' 这是为什么? – Asaf

+0

我收到相同的错误消息。请参阅我的编辑以获取解释和解决方法。 –

0

我解决它通过添加 public interface I extends Comparable<I> 和A类,我改变了方法compareTo

public int compareTo(I obj) 
{ 
    return someVariable - obj.someVariable; 
}