The main problem that is stopping you from seeing the recursion is that your method's arguments are simply an array and a comparator. Were you to pass the starting and ending index (what one typically did in older language), you'd see the possibility of recursion.
I usually don't like to give out pseudo code for such questions, preferring instead to give you hints as of the structure and nature of the algorithm. However, there is no way you will be able to put the 2+2 together when your methods are defined in such a way. So I'm going to make an exception here:
Instead of this (which is what you have):
public static int binarySearch(Comparable[] objArray,Comparable item)
{
int lower=0;
int upper=objArray.length -1;
You have this (this is java-like pseudocode, highly simplified and without error checking, you need to work the actual syntax details):
public static int binarySearch(Comparable[] objArray,Comparable item)
{
return bSearch(objArray, item, 0, objArray.length -1);
....
private static int bSearch(Comparable[] objArray,Comparable item, int lower, int upper)
{
if( lower > upper /* not found */){ return -1; };
int pivot = ((int)((upper - lower) / 2)) + lower;
int cmp = objArray[pivot].compareTo(item);
if( cmp == 0 ){ return pivot; }
else if (cmp < 0 ){ return bSearch(objArray,item, lower, pivot - 1); }
else{ return bSearch(objArray,item, pivot+1, upper); }
}
Again, you need to work the actual syntax and parameter validation, but other than that, this is the typical pseudo-code for a recursive binary search. You should have seen this and worked on it ad nausea at a sophomore programming course at the latest.
Recursion takes place in that:
If your array is sorted, and
If you start the comparison in the middle, aka the pivot,
And the comparison fails,
Then
You know you only need to search one half (either the upper half if target > pivot or the lower half if target < pivot).
So you take the half that you are going to search on, and execute the exact same steps on it again. What better way to do so than to call the exact same algorithm, the exact same function on just that part, that subset of your input?
That's recursion.
Edit: Elaborating in the previous example, when you want/need to implement something recursively in Java, it is better to have an utilitarian method that takes the data structure as a whole (say just the array and the comparison object as you did in your example).
Then have that call an internal method that does the actual recursion (and which has to deal with parameter passing.) The reason for this is that your callers do not have to pass the lower and upper indexes (since they can be computed out of the array object.)
In other, lower level languages like C, Pascal or Ada, you sometimes cannot compute such arguments and have to declare your recursive functions with parameters passed explicitly by your callers.
Ergo why I split the recursion in a separate bSearch function in the above pseudo-code.