So I am reading about generic method and I am get confused. Let me state the problem here first:
In this example: Suppose that I need a version of selectionSort that works for any type T, by using an external comparable supplied by the caller.
First attempt:
public static <T> void selectionSort(T[] arr, Comparator<T> myComparator){....}
Suppose that I have:
- Defined vehicle class
- created VehicleComparator implementing Comparator while compare vehicles by their price.
- created Truck extends vehicle
- instantiated Truck[] arr ; VehicleComparator myComparator
Now, I do:
selectionSort(arr, myComparator);
and it won't work, because myComparator is not available for any subclass of Vehicle.
Then, I do this:
public static <T> void selectionSort(T[] arr, Comparator<? super T> myComparator){....}
This declaration will work, but I don't completely sure what I've been doing... I know use is the way to go. If "? super T" means "an unknown supertype of T", then am I imposing a upper or lower bound? Why is it super? My intention is to let any subclass of T to use myComparator, why "? super T". So confused... I'd appreciate if you have any insight in this..
Thanks ahead!
Firstly, you could have solved it by having
Vehicle[]
which you then addedTruck
s to.The reason you need
<? super T>
goes back to the generics rule thatComparator<Truck>
is not a subtype ofComparator<Vehicle>
; the unbounded typeT
must match exactly, which it doesn't.In order for a suitable
Comparator
to be passed in, it must be aComparator
of the class being compared or any super class of it, because in OO languages any class may be treated as an instance of a superclass. Thus, it doesn't matter what the generic type of theComparator
is, as long as it's a supertype of the array's component type.