You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2013/10/14 22:27:46 UTC

svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

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())));



Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by Oliver Heger <ol...@oliver-heger.de>.
Am 16.10.2013 02:04, schrieb sebb:
> On 15 October 2013 20:55, Oliver Heger <ol...@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 <gu...@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 <se...@gmail.com> wrote:
>>>>
>>>>> On 15 October 2013 18:46, Matt Benson <gu...@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 <se...@gmail.com> wrote:
>>>>>>
>>>>>>> On 15 October 2013 18:14, Benedikt Ritter <br...@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 <oh...@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-unsubscribe@commons.apache.org
>>>>>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>>>>>
>>>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
>> For additional commands, e-mail: dev-help@commons.apache.org
>>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
> 


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


Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by sebb <se...@gmail.com>.
On 15 October 2013 20:55, Oliver Heger <ol...@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 <gu...@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 <se...@gmail.com> wrote:
>>>
>>>> On 15 October 2013 18:46, Matt Benson <gu...@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 <se...@gmail.com> wrote:
>>>>>
>>>>>> On 15 October 2013 18:14, Benedikt Ritter <br...@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 <oh...@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-unsubscribe@commons.apache.org
>>>>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>>>>
>>>>>>
>>>>
>>>
>>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>

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


Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by Oliver Heger <ol...@oliver-heger.de>.
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 <gu...@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 <se...@gmail.com> wrote:
>>
>>> On 15 October 2013 18:46, Matt Benson <gu...@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 <se...@gmail.com> wrote:
>>>>
>>>>> On 15 October 2013 18:14, Benedikt Ritter <br...@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 <oh...@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-unsubscribe@commons.apache.org
>>>>> For additional commands, e-mail: dev-help@commons.apache.org
>>>>>
>>>>>
>>>
>>
>>
> 


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


Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by Matt Benson <gu...@gmail.com>.
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 <gu...@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 <se...@gmail.com> wrote:
>
>> On 15 October 2013 18:46, Matt Benson <gu...@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 <se...@gmail.com> wrote:
>> >
>> >> On 15 October 2013 18:14, Benedikt Ritter <br...@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 <oh...@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-unsubscribe@commons.apache.org
>> >> For additional commands, e-mail: dev-help@commons.apache.org
>> >>
>> >>
>>
>
>

Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by Matt Benson <gu...@gmail.com>.
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 <se...@gmail.com> wrote:

> On 15 October 2013 18:46, Matt Benson <gu...@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 <se...@gmail.com> wrote:
> >
> >> On 15 October 2013 18:14, Benedikt Ritter <br...@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 <oh...@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-unsubscribe@commons.apache.org
> >> For additional commands, e-mail: dev-help@commons.apache.org
> >>
> >>
>

Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by sebb <se...@gmail.com>.
On 15 October 2013 18:46, Matt Benson <gu...@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 <se...@gmail.com> wrote:
>
>> On 15 October 2013 18:14, Benedikt Ritter <br...@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 <oh...@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-unsubscribe@commons.apache.org
>> For additional commands, e-mail: dev-help@commons.apache.org
>>
>>

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


Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by Matt Benson <gu...@gmail.com>.
Does that work?  Seems I recently encountered the types after & having to
be interfaces.

Matt


On Tue, Oct 15, 2013 at 12:31 PM, sebb <se...@gmail.com> wrote:

> On 15 October 2013 18:14, Benedikt Ritter <br...@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 <oh...@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-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>

Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by sebb <se...@gmail.com>.
On 15 October 2013 18:14, Benedikt Ritter <br...@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 <oh...@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-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: svn commit: r1532068 - /commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/DynaBeanMapDecorator.java

Posted by Benedikt Ritter <br...@apache.org>.
Hi Oliver,

why can't we implement Map<K, V> and make the decorator a generic type here?

Benedikt


2013/10/14 <oh...@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