commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dipanjan Laha (JIRA)" <>
Subject [jira] [Commented] (COLLECTIONS-508) MultiMap's methods are not strongly typed even though the interface supports generics
Date Thu, 20 Mar 2014 16:14:45 GMT


Dipanjan Laha commented on COLLECTIONS-508:

I have attached a patch (MultiValuedMap_4) which has the UnmodifiableMultiValuedMap including
all my earlier changes. It has some other changes which I am listing below.
- I have created a AbstractMultiValuedMapDecorator which UnmodifiableMultiValuedMap is extending
- I have added two methods to MultiValuedMap, size(Object key) and iterator(Object key). Let
me know if you think that these do not make sense, i'll remove them.
- The equals method of AbstractMultiValuedMap was flawed in my earlier patch, I have changed
it, please take a look.
- I have created a AbstractMultiValuedMapTest which can be extended by others. I have changed
MultiValuedHashMapTest to extend it and so does UnmodifiableMultiValuedMapTest.

I am working on the Transformed map which I should complete by the weekend. 
It would be great if you can point out my errors in my earlier patch, so hopefully I won't
make them again :)

> MultiMap's methods are not strongly typed even though the interface supports generics
> -------------------------------------------------------------------------------------
>                 Key: COLLECTIONS-508
>                 URL:
>             Project: Commons Collections
>          Issue Type: Improvement
>          Components: Map
>    Affects Versions: 4.0
>            Reporter: Dipanjan Laha
>         Attachments: MultiValuedMap.patch, MultiValuedMap_2.patch, MultiValuedMap_3.patch
> Recently I had the need of using a MultiMap in one of my projects. While using the same,
I found that the MultiMap interface  has methods that are not strongly typed even though the
interface supports generics. For example if I have a MultiMap like so
> MultiMap<String, User> multiMap = new MultiValueMap<String, User>();
> where User is a custom  Class, then the get(key) method would return me an Object which
I would need to cast to a Collection like so
> Collection<User> userCol = (Collection<User>) multiMap.get(key);
> I understand that this limitation comes from that fact that the MultiMap extends IterableMap
which in turn extends Map and other interfaces. Hence the MultiMap cannot have a get method
which returns a Collection instead of Object as that would mean implementing IterableMap with
the Generics set to be <K,Collection<V>>. In that case the put method's signature
would become
> public Collection<V> put(K key, Collection<V> value); 
> which we do not want.The same problem would arise with other methods as well, ex: containsValue
> My proposal is why carry on the signatures of a Map and put it on MultiMap. Where as
I do agree that it is a Map after all and has very similar implementation and functionality,
it is very different at other levels. And even though the MultiMap interface supports generics,
the methods are not strongly typed, which defeats the purpose of having generics. So why can't
we have a separate set of interfaces for MultiMap which do not extend Map. That way we can
have strongly typed methods on the MultiMap.
> I have included a a patch for these changes. It is not fully complete and has some gaps
in some TestCases and the documentation but gives a fairly good idea of what I am talking
about. Please let me know your thoughts on taking this approach. Then i will improve the implementation
and submit another patch.
> The other way could be that we let MultiMap extend the interfaces it does today, but
with proper types rather than Object. I mean something like this
> public interface MultiMap<K,V> extends IterableMap<K,Collection<V>>
instead of 
> public interface MultiMap<K,V> extends IterableMap<K,Object>
> And then have a separate set of methods on the MultiMap interface which supports the
specific MultiMap functionality. For example, the put method with the above implementation
would become 
> Collection<V>	put(K key, Collection<V> value)
> and we can have another method as 
> V putValue(K key, V value)
> This way the functionality of Map is preserved along with strongly typed MultiMap methods.
If you feel that this approach is better than the earlier one, i will implement the same and
submit a patch

This message was sent by Atlassian JIRA

View raw message