It provides templates: class templates, function templates, alias templates and variable templates. Which allow writing reusable code, while still preserving compile-time type checking and guaranteeing zero-overhead when using a template compared to using separate concrete implementations.
Java and other higher-level languages provides (and arguably incites) code that is more maintainable through the use of abstraction. In other words, they consider lower-level features like memory management not as "function" but as "structure" which is only noise mixed on top of the business goal.
Jon Pearce (1998) Programming and Meta-Programming in Scheme: "Structure and function should be independent".
Lack of distinction between an object and a reference to it in Java. For example it makes concurrent programming more challenging if we cannot distinguish between local/our and shared objects by looking at the objects type.