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. 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