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