&quot;I think the overhead here is the programmer time spent specifying the types in a program&quot;<p>There are different overheads on program structure and verbosity which goes way beyond type annotations, depending on the language used and the style of the particular developer.<p>For example, in dynamic languages, a single container such as a list can contain any entities and functions can accept any entity as a parameter.<p>Java and C# can achieve this same using just object handles - but in other statically typed languges one either implements several containers and functions, or uses or creates an algebraic datatype using the language native typing (i.e. Scala, F#, etc) or invents ones own which is then utilizes in the container signature or function definition.