For all of these methods I'd suggest not having a default key_class and value_class. Did you find it inconvenient to always pass them? I'm worried that a user will miss them and then get hard to explain ClassCastExceptions. It seems like a small ask to make these required parameters by default.