To clarify, we can decompose this puzzling-looking expression into its elements and put them back together.
Premise
We have a method find(? array[], ? key) that looks for a key within an array. We want to use this method for different types of input arguments, e.g., an array/key of String, Integer, whatever.
Parametric Type <U>
We put <U> in front of the method signature to indicate that it is a parametric method. This means that in the rest of the declaration, U is a placeholder that will be replaced by a type where the method is invoked. (I use U instead of T for reasons that will become obvious below.)
But, we can't replace U with any type because to be able to correctly implement the method, we want to be able to compare the elements in the array to each other (for instance to sort the array). The common interface used to define this behavior is Comparable. It has a single method, compareTo.
Type Bound <U extends Comparable>
To require that the U type parameter only be replaceable (instantiable) with a type that is a subtype of Comparable, we impose the type bound: extends Comparable. This allow us to call compareTo on key or on array elements such as array[0] in a type safe way.
However, we're not done here, because Comparable is itself a generic type: Comparable<T>, where the type parameter T governs the type of the parameter for compareTo. We thus need to instantiate T when we use Comparable<T>.
Instantiating Comparable<T>
Before instantiating T in Comparable, our expression is <U extends Comparable<T>>. We need to replace T with the desired type. What should be the type of the parameter to compareTo? If we are passing an array of String to find, we would be comparing Strings, etc. In the generic case we are passing an array of U to find, so we would like to compare objects of type U. So in this case we instantiate T in Comparable<T> with another generic type, U: <U extends Comparable<U>>, which is the same as <T extends Comparable<T>>