"This provides a high degree of specificity, to the point where expressions such as a+b can be interpreted relative to the behavior of + on the instantiated types of a and b, but entails a large code footprint as well as a loss of abstraction -- one cannot declare a variable whose type is the equivalent of Foo in Java. (C++ does have template methods, so it retains behavioral parametricity but n" . . . .