user1189571
user1189571

Reputation: 305

Java - sorting using Collections.sort()

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

Answers (2)

Bohemian
Bohemian

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

Oskar Kjellin
Oskar Kjellin

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

Related Questions