Reputation: 305
I have to write a method to sort both Integers and Doubles.
public ArrayList<Number> sortDescending(ArrayList<Number> al){
Comparator<Number> c=Collections.reverseOrder();
Collections.sort(al,c);
return al;
}
public ArrayList<Number> sortAscending(ArrayList<Number> al){
Collections.sort(al);
return al;
}
The problem is that in sortAscending, the following error occurs:
Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (ArrayList). The inferred type Number is not a valid substitute for the bounded parameter < T extends Comparable < ? super T>>
Upvotes: 3
Views: 12982
Reputation: 424983
You need to use a generic upper bound of Number
intersecting with Comparable<T>
:
public <T extends Number & Comparable<T>> ArrayList<T> sortDescending(ArrayList<T> al){
Comparator<T> c=Collections.reverseOrder();
Collections.sort(al,c);
return al;
}
public <T extends Number & Comparable<T>> ArrayList<T> sortAscending(ArrayList<T> al){
Collections.sort(al);
return al;
}
All JDK Numbers
(eg Float
, Integer
etc) match this typing.
For the uninitiated, the syntax <T extends A & B>
is the way you bound T
to both A
and B
.
FYI, there is no syntax for "or" logic (nor would it make sense if you think about it)
Upvotes: 9
Reputation: 21860
You are getting the error because number does not implement Comparable<Number>
. You need to add a generic contstraint so that it extends both number and Comparable. In this case:
public <T extends Number & Comparable<T>> ArrayList<T> sortAscending(ArrayList<T> al){
Collections.sort(al);
return al;
}
Upvotes: 4