[英]Using a Custom-Defined Comparator in a Constructor
我在構造函數中使用比較器時遇到困難。 當我嘗試以下代碼時:
InsertionSorter is = new InsertionSorter(bookList.toArray(new Comparable[bookList.size()]), new GenreComparator(), SortType.ASC);
我收到此錯誤:
no suitable constructor found for InsertionSorter(java.lang.Comparable[],sort.GenreComparator,sort.SortType)
constructor sort.InsertionSorter.InsertionSorter(java.lang.Comparable[],java.util.Comparator<java.lang.Object>,sort.SortType) is not applicable
(actual argument sort.GenreComparator cannot be converted to java.util.Comparator<java.lang.Object> by method invocation conversion)
constructor sort.InsertionSorter.InsertionSorter(java.lang.Comparable[],sort.SortType) is not applicable
(actual and formal argument lists differ in length)
以下是有用的代碼段:
AbstractSorter.java:
abstract class AbstractSorter {
protected Comparable[] values;
protected Comparator<Object> cmp;
protected SortType st;
protected abstract void doSort();
protected AbstractSorter(Comparable[] init, SortType type) {
values = new Comparable[init.length];
System.arraycopy(init, 0, values, 0, init.length);
cmp = null;
st = type;
}
protected AbstractSorter(Comparable[] init, Comparator<Object> comp, SortType type) {
values = new Comparable[init.length];
System.arraycopy(init, 0, values, 0, init.length);
cmp = comp;
st = type;
}
public Comparable[] getValues() {
return values;
}
}
class InsertionSorter extends AbstractSorter {
public InsertionSorter(Comparable[] init, SortType type) {
super(init, type);
}
public InsertionSorter(Comparable[] init, Comparator<Object> comp, SortType type) {
super(init, comp, type);
}
@Override
public void doSort() {
// sorts values
}
}
enum SortType {ASC, DSC};
Book.java:
public class Book implements Cloneable, Comparable<Book> {
private Person author; // implementation details of Person don't matter here
private String title, isbn;
private int year;
private BookGenre genre;
public Book(Person authorInit, String titleInit, String isbnInit,
int yearInit, BookGenre genreInit) {
author = authorInit;
title = titleInit;
isbn = isbnInit;
year = yearInit;
genre = genreInit;
}
@Override
public String toString() {
return author.toString() + " " + title + " " + isbn + " " + year
+ " " + genre;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public int compareTo(Book other) {
return author.compareTo(other.author);
}
public Person getAuthor() {
return author;
}
public String getTitle() {
return title;
}
public String getIsbn() {
return isbn;
}
public int getYear() {
return year;
}
public BookGenre getGenre() {
return genre;
}
}
class TitleComparator implements Comparator<Book> {
@Override
public int compare(Book a, Book b) {
return a.getTitle().compareToIgnoreCase(b.getTitle());
}
}
class GenreComparator implements Comparator<Book> {
@Override
public int compare(Book a, Book b) {
return a.getGenre().compareTo(b.getGenre());
}
}
enum BookGenre { COMIC, MYSTERY, SCIENCE, TRAVEL };
編輯感謝Rohit為這個問題提供的解決方案,但是現在我遇到了一個相關問題。 在doSort()
方法中,我有代碼片段
cmp.compare(values[j-1], values[j])
(不用擔心,如果cmp == null
,我將進行檢查以確保不會被調用。這會產生以下錯誤:
method compare in interface java.util.Comparator<T> cannot be applied to given types;
required: capture#1 of ? extends java.lang.Object,capture#1 of ? extends java.lang.Object
found: java.lang.Comparable,java.lang.Comparable
reason: actual argument java.lang.Comparable cannot be converted to capture#1 of ? extends java.lang.Object by method invocation conversion
請注意,我已經在AbstractSort.java中更改了上述內容,將Comparable<Object>
替換為Comparable<? extends Object>
Comparable<? extends Object>
GenreComparator
類實現Comparator<Book>
。 因此,您不能在需要Comparator<Object>
的情況下傳遞該類的實例。 兩者都不兼容。
但是,您可以將Comparator<Object>
更改為Comparator<? extends Object>
在構造函數中Comparator<? extends Object>
,在AbstractSorter
類中Comparator<? extends Object>
cmp
的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.