Hi Thomas,
Thomas Neidhart wrote:
> Hi,
>
> during the vote for collections 4.0 we have discovered a problem wrt the
> MultiMap interface in general and specifically the MultiKeyMap.
>
> Java 8 introduces a new default method in the Map interface:
>
> boolean remove(Object key, Object value)
>
> This clashes with the method in MultiMap:
>
> V remove(K key, V value)
>
> and the remove methods for multiple keys in MultiKeyMap:
>
> V remove(K key1, K key2)
>
>
> Just changing the return type does not solve the problem, as one can not
> re-define a method in an interface without using the @Override
> annotation, but this would only work when compiling with JDK 8 and fail
> for other JDKs.
We could introduce a compatibility interface and implement it like
interface Java8Map {
public boolean remove(Object key, Object value);
}
I wonder if it makes any problems for Java 8 though.
> For the MultiKeyMap it would be semantically wrong too, thus I propose a
> name change.
The question is nevertheless, what does that method of Java 8 to
MultiKeyMap? With Java 8 it simply exists.
> For MultiMap:
>
> boolean removeMapping(K key, V value)
If the method will do the same as Java 8 remove, we can stay with "remove"
assuming the approach from above works.
> For MultiKeyMap (for all remove(K ...) methods):
>
> V removeMultiKey(K key1, K key2)
> V removeMultiKey(K key1, K key2, K key3)
> ...
>
>
> In the case of the MultiMap, I think returning a boolean makes more
> sense, similar as Java 8 does it.
>
> For the MultiKeyMap, returning the previously mapped value is preferable
> imho.
The question is anyway, if we should keep the overloaded method names. Since
the inherited methods use "MultiKey<? extends K>" as key type in their
signatures, we might as well introduce new names and provide vararg support,
something like this:
V putInto(V newVal, K... keys);
V removeFrom(K... keys);
V containsKeys(K... keys);
...
What do you think?
- Jörg
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]