I'm also learning from that book (Java The Complete Reference Twelfth Edition)
The only way i understood the second quote, its in the code below:
interface FuncInterf<O, T>
{
int func(O op, T[] arr, T val);
}
class Operations<T>
{
int countMatches(T[] arr, T val)
{
int counter = 0;
for(int i=0; i<arr.length; i++)
if(arr[i] == val)
counter++;
return counter;
}
}
public class Main
{
static <O, T> int methRef(FuncInterf<O, T> fI, O op, T[] arr, T val)
{
return fI.func(op, arr, val);
}
public static void main(String[] args)
{
Integer[] iArr = {1, 2, 3, 4, 3, 5};
int iVal = 3;
int matches = 0;
FuncInterf<Operations<Integer>, Integer> fI = Operations<Integer>::countMatches;
matches = methRef(fI, new Operations<Integer>(), iArr, iVal);
System.out.println("Total of " + iVal + "'s: " + matches);
}
}
The interesting part is that, an extra type parameter (letter 'O') on interface FuncInterface <O, T> and also, an extra parameter (O op) on method func is needed to be able to reference the method countMatches and do what the book says:
In cases in which a
generic class is specified, the type argument follows the class name and precedes the ::
Which is: Operations<Integer>::countMatches;
The reason that O op is created its because it will be the object thats going to call/reference countMatches method from methRef method in return fI.func(op, arr, val);
O will be type Operations<T>, and <T> Integer in this example. Resulting in Operations<Integer>
This kind of method reference its a 'Reference to instance method of an arbitrary object of a given type'. The method (countMatches) thats implementing Functional Interface's SAM (Single Abstract Method) doesn't need to have an extra parameter O op, because actually op its "indirectly" calling countMatches
SomeTest <Integer> mRef = MyClass :: <Integer> myGenMeth;in that main class