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

Reply via email to