On 15 October 2013 20:55, Oliver Heger <oliver.he...@oliver-heger.de> wrote: > Despite the fact that this is an interesting problem, do generic > parameters really make sense here? The map provided by the decorator is > in fact a Map<String, Object>. But because of backwards compatibility > these parameter types cannot be used.
Why cannot they be used? Is it because it breaks binary compatibility or source compatibility? > Would it improve situation to add > type parameters to the decorator class? > > Oliver > > Am 15.10.2013 21:30, schrieb Matt Benson: >> Or, more directly/formally, at: >> http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4 >> >> Matt >> >> >> On Tue, Oct 15, 2013 at 2:26 PM, Matt Benson <gudnabr...@gmail.com> wrote: >> >>> We may be talking about different things. I think I am talking about type >>> variable bounds declarations; I'm not 100% sure of the context in which >>> your suggestion was offered. The restriction on type bounds is documented >>> at [1]. >>> >>> Matt >>> [1] http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.9 >>> >>> >>> >>> >>> On Tue, Oct 15, 2013 at 2:10 PM, sebb <seb...@gmail.com> wrote: >>> >>>> On 15 October 2013 18:46, Matt Benson <gudnabr...@gmail.com> wrote: >>>>> Does that work? >>>> >>>> Let's try it? >>>> >>>>> Seems I recently encountered the types after & having to >>>>> be interfaces. >>>> >>>> Why should that be? Is that documented anywhere? >>>> >>>>> Matt >>>>> >>>>> >>>>> On Tue, Oct 15, 2013 at 12:31 PM, sebb <seb...@gmail.com> wrote: >>>>> >>>>>> On 15 October 2013 18:14, Benedikt Ritter <brit...@apache.org> wrote: >>>>>>> Hi Oliver, >>>>>>> >>>>>>> why can't we implement Map<K, V> and make the decorator a generic >>>> type >>>>>> here? >>>>>> >>>>>> Also, I believe it is possible to define a generic parameter as >>>>>> String, but default to Object as the erased type. >>>>>> This would improve the source code checking without compromising >>>>>> binary compatibility. >>>>>> >>>>>> The syntax is something like >>>>>> >>>>>> Set<Object & String> >>>>>> >>>>>>> Benedikt >>>>>>> >>>>>>> >>>>>>> 2013/10/14 <ohe...@apache.org> >>>>>>> >>>>>>>> Author: oheger >>>>>>>> Date: Mon Oct 14 20:27:46 2013 >>>>>>>> New Revision: 1532068 >>>>>>>> >>>>>>>> URL: http://svn.apache.org/r1532068 >>>>>>>> Log: >>>>>>>> Added generics. >>>>>>>> >>>>>>>> Modified: >>>>>>>> >>>>>>>> >>>>>> >>>> commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java >>>>>>>> >>>>>>>> Modified: >>>>>>>> >>>>>> >>>> commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java >>>>>>>> URL: >>>>>>>> >>>>>> >>>> http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java?rev=1532068&r1=1532067&r2=1532068&view=diff >>>>>>>> >>>>>>>> >>>>>> >>>> ============================================================================== >>>>>>>> --- >>>>>>>> >>>>>> >>>> commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java >>>>>>>> (original) >>>>>>>> +++ >>>>>>>> >>>>>> >>>> commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java >>>>>>>> Mon Oct 14 20:27:46 2013 >>>>>>>> @@ -16,14 +16,13 @@ >>>>>>>> */ >>>>>>>> package org.apache.commons.beanutils; >>>>>>>> >>>>>>>> -import java.util.Map; >>>>>>>> -import java.util.List; >>>>>>>> import java.util.ArrayList; >>>>>>>> -import java.util.Set; >>>>>>>> -import java.util.HashSet; >>>>>>>> -import java.util.Iterator; >>>>>>>> import java.util.Collection; >>>>>>>> import java.util.Collections; >>>>>>>> +import java.util.HashSet; >>>>>>>> +import java.util.List; >>>>>>>> +import java.util.Map; >>>>>>>> +import java.util.Set; >>>>>>>> >>>>>>>> /** >>>>>>>> * <p>Decorates a {@link DynaBean} to provide <code>Map</code> >>>>>>>> behaviour.</p> >>>>>>>> @@ -66,15 +65,18 @@ import java.util.Collections; >>>>>>>> * and <code>values()</code> methods create an >>>>>>>> <b><i>unmodifiable</i></b> >>>>>>>> * <code>Set</code> and it does not support the Map's >>>>>>>> <code>clear()</code> >>>>>>>> * and <code>remove()</code> operations.</p> >>>>>>>> + * <p>For reasons of backwards compatibility, the generic types of >>>> this >>>>>>>> + * {@code Map} implementation are {@code <Object, Object>}. >>>> However, >>>>>>>> the >>>>>>>> + * keys of the map are typically strings.</p> >>>>>>>> * >>>>>>>> * @since BeanUtils 1.8.0 >>>>>>>> * @version $Id$ >>>>>>>> */ >>>>>>>> -public class DynaBeanMapDecorator implements Map { >>>>>>>> +public class DynaBeanMapDecorator implements Map<Object, Object> { >>>>>>>> >>>>>>>> private final DynaBean dynaBean; >>>>>>>> private final boolean readOnly; >>>>>>>> - private transient Set keySet; >>>>>>>> + private transient Set<Object> keySet; >>>>>>>> >>>>>>>> // ------------------- Constructors >>>>>> ---------------------------------- >>>>>>>> >>>>>>>> @@ -181,9 +183,9 @@ public class DynaBeanMapDecorator implem >>>>>>>> * @return An unmodifiable set of the DynaBean >>>>>>>> * property name/value pairs >>>>>>>> */ >>>>>>>> - public Set entrySet() { >>>>>>>> + public Set<Map.Entry<Object, Object>> entrySet() { >>>>>>>> DynaProperty[] properties = getDynaProperties(); >>>>>>>> - Set set = new HashSet(properties.length); >>>>>>>> + Set<Map.Entry<Object, Object>> set = new >>>>>>>> HashSet<Map.Entry<Object, Object>>(properties.length); >>>>>>>> for (int i = 0; i < properties.length; i++) { >>>>>>>> String key = properties[i].getName(); >>>>>>>> Object value = getDynaBean().get(key); >>>>>>>> @@ -225,14 +227,14 @@ public class DynaBeanMapDecorator implem >>>>>>>> * @return An unmodifiable set of the {@link DynaBean}s >>>>>>>> * property names. >>>>>>>> */ >>>>>>>> - public Set keySet() { >>>>>>>> + public Set<Object> keySet() { >>>>>>>> if (keySet != null) { >>>>>>>> return keySet; >>>>>>>> } >>>>>>>> >>>>>>>> // Create a Set of the keys >>>>>>>> DynaProperty[] properties = getDynaProperties(); >>>>>>>> - Set set = new HashSet(properties.length); >>>>>>>> + Set<Object> set = new HashSet<Object>(properties.length); >>>>>>>> for (int i = 0; i < properties.length; i++) { >>>>>>>> set.add(properties[i].getName()); >>>>>>>> } >>>>>>>> @@ -275,14 +277,12 @@ public class DynaBeanMapDecorator implem >>>>>>>> * @throws UnsupportedOperationException if >>>>>>>> * <code>isReadOnly()</code> is true. >>>>>>>> */ >>>>>>>> - public void putAll(Map map) { >>>>>>>> + public void putAll(Map<? extends Object, ? extends Object> >>>> map) { >>>>>>>> if (isReadOnly()) { >>>>>>>> throw new UnsupportedOperationException("Map is read >>>>>> only"); >>>>>>>> } >>>>>>>> - Iterator keys = map.keySet().iterator(); >>>>>>>> - while (keys.hasNext()) { >>>>>>>> - Object key = keys.next(); >>>>>>>> - put(key, map.get(key)); >>>>>>>> + for (Map.Entry<?, ?> e : map.entrySet()) { >>>>>>>> + put(e.getKey(), e.getValue()); >>>>>>>> } >>>>>>>> } >>>>>>>> >>>>>>>> @@ -312,9 +312,9 @@ public class DynaBeanMapDecorator implem >>>>>>>> * >>>>>>>> * @return Unmodifiable collection of values. >>>>>>>> */ >>>>>>>> - public Collection values() { >>>>>>>> + public Collection<Object> values() { >>>>>>>> DynaProperty[] properties = getDynaProperties(); >>>>>>>> - List values = new ArrayList(properties.length); >>>>>>>> + List<Object> values = new >>>> ArrayList<Object>(properties.length); >>>>>>>> for (int i = 0; i < properties.length; i++) { >>>>>>>> String key = properties[i].getName(); >>>>>>>> Object value = getDynaBean().get(key); >>>>>>>> @@ -361,7 +361,7 @@ public class DynaBeanMapDecorator implem >>>>>>>> /** >>>>>>>> * Map.Entry implementation. >>>>>>>> */ >>>>>>>> - private static class MapEntry implements Map.Entry { >>>>>>>> + private static class MapEntry implements Map.Entry<Object, >>>> Object> >>>>>> { >>>>>>>> private final Object key; >>>>>>>> private final Object value; >>>>>>>> MapEntry(Object key, Object value) { >>>>>>>> @@ -373,7 +373,7 @@ public class DynaBeanMapDecorator implem >>>>>>>> if (!(o instanceof Map.Entry)) { >>>>>>>> return false; >>>>>>>> } >>>>>>>> - Map.Entry e = (Map.Entry)o; >>>>>>>> + Map.Entry<?, ?> e = (Map.Entry<?, ?>)o; >>>>>>>> return ((key.equals(e.getKey())) && >>>>>>>> (value == null ? e.getValue() == null >>>>>>>> : value.equals(e.getValue()))); >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> http://people.apache.org/~britter/ >>>>>>> http://www.systemoutprintln.de/ >>>>>>> http://twitter.com/BenediktRitter >>>>>>> http://github.com/britter >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>>> >>>>>> >>>> >>> >>> >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org