Am 16.10.2013 02:04, schrieb sebb:
> 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?

So far DynaBeanMapDecorator implements the raw Map type and according to
this has methods like put(Object, Object). If we now change this to
Map<String, Object>, the method signatures would have to change, too,
e.g. put(String, Object) which would break binary compatibility.

The code expects to have String keys in the map. Therefore, I don't
think that additional type parameters will work well.

Oliver

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


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to