I have the following sort
method in a clone of ArrayList
:
JavaScript
x
@SuppressWarnings({"rawtypes", "unchecked"})
public void sort(Comparator<? super E> c){
if(c == null){
// Use ascending order (only works if types are comparable)
class ascComparator<T> implements Comparator<T> {
public int compare(T a, T b) {
// This will raise an exception if the types are not comparable
return ((Comparable)a).compareTo(b);
}
}
c = new ascComparator<E>();
}
// Cast the internal array to comparable then call merge sort
sorter.mergeSort((Comparable[])array, c);
}
The sorter
object is an instance of Sort
:
JavaScript
public class Sort {
@SuppressWarnings("unchecked")
public <E extends Comparable<E>> E[] mergeSort(E[] list, Comparator<? super E> c){
}
}
I get the following error on the sorter.mergeSort
line:
JavaScript
The method mergeSort(E[], Comparator<? super E>) in the type Sort is not applicable for the arguments (Comparable[], Comparator<capture#8-of ? super E>)
I’m not sure why this is happening as both the parameter and argument have type Comparator<? super E>
.
Advertisement
Answer
Thanks to everyone for their comments. I’ve now fixed it.
JavaScript
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c){
if(c == null){
// Use ascending order (only works if types are comparable)
class ascComparator<T> implements Comparator<T> {
public int compare(T a, T b) {
// This will raise an exception if the types are not comparable
return ((Comparable<T>)a).compareTo(b);
}
}
c = new ascComparator<E>();
}
// Cast the internal array to E then call merge sort
sorter.sort((E[]) array, c);
}
As Kayaman said, I shouldn’t use rawtypes
so I’ve given ascComparator
parameter T
. I’ve also casted array
to E
instead of Comparable
as it didn’t do what I thought it did. I’ve also changed Sort
:
JavaScript
@SuppressWarnings("unchecked")
private <E> E[] mergeSort(E[] list, Comparator<E> c){
}
As pointed out by Louis Wasserman I don’t need the Comparable
type cast.