繁体   English   中英

Java SuperClass和SubClass扩展可比

[英]Java SuperClass and SubClass extending comparable

我正在执行此作业,我们必须创建2种类型的对象,

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)未定义”。 我在这里做错了什么? 先感谢您。

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

你可以说

public Sort(List<? extends Object> inputArray) 

这样它将接受任何类型。

只是因为你被点名了场“personArray”并不能使一个数组-你传递一个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);

它不是很清楚,但是如果正确,那么您可以使用另一个新类进行排序,这很可能实现了COMPARATOR。

所以在我们的例子中Sort class应该是

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

然后在main ,请致电

Collections.sort(list,new Sort());

我也需要做书。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM