Java SuperClass和SubClass扩展可比

时间:2014-04-02 04:02:13

标签: java sorting subclass superclass

我正在做这个任务,我们必须创建两种类型的对象,

public class Person implements Cloneable, Comparable<Person>

public class Book implements Cloneable, Comparable<Book>

该程序的主要任务是使用自己的比较函数对两种类型进行排序,如下所示:

compareTo(Person o)
compareTo(Book o)

所以,我在main函数中创建了2个ListArray,用于存储book和person对象,如下所示:

List<Book> bookArray = new ArrayList<Book>();
List<Person> peopleArray = new ArrayList<Person>();

我的排序算法在另一个类中实现,如下所示:

public class Sort{
Comparable<Object>[] values;
public Sort(List<Object> inputArray) {
  this.values = (Comparable<Object>[]) inputArray.toArray();
}
public doSort() {
  //sort implementation...
}

问题是使用上面的数组调用此函数时

Sort sorter = new Sort(peopleArray);
sorter.doSort();

Eclipse显示错误提示“构造函数Sort(List)未定义。” 我在这做错了什么? 提前谢谢。

3 个答案:

答案 0 :(得分:2)

您可以将任何类实例传递给Object类型。但List不是List的父级。这只是两种不同的类型。

你可以说

public Sort(List<? extends Object> inputArray) 

这样它就会接受任何类型。

答案 1 :(得分:2)

仅仅因为你命名字段&#34; personArray&#34;不使它成为一个数组 - 当声明构造函数期望一个数组时,你传入一个List

我建议你永远不要使用数组,除非你绝对必须;相反,使用集合,因为它们所以更容易处理,与普遍看法相反,性能差异可以忽略不计。

如果从代码中删除所有数组,并添加一些泛型,它将全部起作用:

public class Sort<T extends Comparable<T>> {
    private List<T> values;

    public Sort(List<T> values) {
        this.values = values;
    }

    public void doSort() {
        Collections.sort(values);
    }
}

请注意,如果完全排序,这整个类只会增加很少的值。您的客户端代码可以只改为编码这一行:

Collections.sort(values);

答案 2 :(得分:0)

它不是那么清楚,但如果你是对的Whenevr你使用另一个新类进行排序,这可能是实现COMPARATOR。

所以在你的例子中,排序类应该是

Class Sort implemets Comaparator<Person> {
public void Compare(Object 01,Object 02) {
 return (Person)o1.comapareTo(Person)o2;
}

然后在main,请致电

Collections.sort(list,new Sort());
你也需要为书做。