Java - sorting using Collections.sort()

12,967

Solution 1

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)

Solution 2

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;
}
Share:
12,967
user1189571
Author by

user1189571

Updated on June 26, 2022

Comments

  • user1189571
    user1189571 almost 2 years

    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>>