Я думаю, что дженерики могут быть демонстрацией для реализации здесь. Если вы посмотрите только на интерфейс Map, есть общие спецификаторы для типа ключа (K) и типа значения (V). Я не верю, что можно было бы легко определить его с помощью обобщений без разделения реализаций на несколько классов (по одному для каждого количества ключевых компонентов).
Вам понадобится класс для каждого:
MultiKeyMap2<K1,K2,V>
MultiKeyMap3<K1,K2,K3,V>
MultiKeyMap4<K1,K2,K3,K4,V>
MultiKeyMap5<K1,K2,K3,K4,K5,V>
Базовая реализация в основном делает то, что вы предлагаете (используя пользовательский класс). Тем не менее, он формально не создает класс для него, все встроено. Это действительно деталь реализации. Но для использования коллекций Google пользовательский класс для выполнения того же действия будет работать примерно так же, как я уверен, что реализую hashCode () и equals ().