This issue is related to the fact that primitive types in Java are not unified to be substitutable for Object
, and with generic type erasure.
Using Function<T, Integer>
instead of IntFunction<T>
when the last one suffices has 2 disadvantages:
- Every returned
int
is boxed – meaning a larger memory footprint; - Every returned
Integer
gets an automatic runtime check (which can be optimized away, but yeah…);
Note that these kinds of issues with the collection framework in Java have led people to write a whole library, named Trove, that eschews the generic interfaces in favor of specialized collection types for every primitive type.