Generic parameters can only bind to reference types, not primitive types, so you need to use the corresponding wrapper types. Try HashMap instead.
However, I'm having trouble figuring out why HashMap fails to be able to deal with primitive data types.
This is due to type erasure. Java didn't have generics from the beginning so a HashMap is really a HashMap. The compiler does a bunch of additional checks and implicit casts to make sure you don't put the wrong type of value in or get the wrong type out, but at runtime there is only one HashMap class and it stores objects.
Other languages "specialize" types so in C++, a vector is very different from a vector internally and they share no common vector> super-type. Java defines things though so that a List is a List regardless of what T is for backwards compatibility with pre-generic code. This backwards-compatibility requirement that there has to be a single implementation class for all parameterizations of a generic type prevents the kind of template specialization which would allow generic parameters to bind to primitives.