Essentially, closures types exists transiently only at compile time - closure types are converted at object types at compile time. [Note: I wonder why user has to repeat the types of closure parameters - why not allow (x) { x + 2 }; and infer the x's type to be int from the IntFunction.invoke's signature.