diff --git a/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperGenericsTests.java b/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperGenericsTests.java index 7348aa5ee8a..7b42535d213 100644 --- a/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperGenericsTests.java +++ b/org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperGenericsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,6 @@ package org.springframework.beans; -import static org.junit.Assert.*; - import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Arrays; @@ -31,18 +29,18 @@ import java.util.Map; import java.util.Set; import junit.framework.Assert; - +import static org.junit.Assert.*; import org.junit.Test; -import org.springframework.beans.propertyeditors.CustomNumberEditor; -import org.springframework.beans.propertyeditors.StringTrimmerEditor; -import org.springframework.core.io.Resource; -import org.springframework.core.io.UrlResource; - import test.beans.GenericBean; import test.beans.GenericIntegerBean; import test.beans.GenericSetOfIntegerBean; import test.beans.TestBean; +import org.springframework.beans.propertyeditors.CustomNumberEditor; +import org.springframework.beans.propertyeditors.StringTrimmerEditor; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; + /** * @author Juergen Hoeller * @author Chris Beams @@ -62,6 +60,19 @@ public final class BeanWrapperGenericsTests { assertTrue(gb.getIntegerSet().contains(new Integer(5))); } + @Test + public void testGenericLowerBoundedSet() { + GenericBean gb = new GenericBean(); + BeanWrapper bw = new BeanWrapperImpl(gb); + bw.registerCustomEditor(Number.class, new CustomNumberEditor(Integer.class, true)); + Set input = new HashSet(); + input.add("4"); + input.add("5"); + bw.setPropertyValue("numberSet", input); + assertTrue(gb.getNumberSet().contains(new Integer(4))); + assertTrue(gb.getNumberSet().contains(new Integer(5))); + } + @Test public void testGenericSetWithConversionFailure() { GenericBean gb = new GenericBean(); diff --git a/org.springframework.beans/src/test/java/test/beans/GenericBean.java b/org.springframework.beans/src/test/java/test/beans/GenericBean.java index f6e13e90527..add4659b450 100644 --- a/org.springframework.beans/src/test/java/test/beans/GenericBean.java +++ b/org.springframework.beans/src/test/java/test/beans/GenericBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,6 +34,8 @@ public class GenericBean { private Set integerSet; + private Set numberSet; + private List resourceList; private List> listOfLists; @@ -105,6 +107,14 @@ public class GenericBean { this.integerSet = integerSet; } + public Set getNumberSet() { + return numberSet; + } + + public void setNumberSet(Set numberSet) { + this.numberSet = numberSet; + } + public List getResourceList() { return resourceList; } diff --git a/org.springframework.core/src/main/java/org/springframework/core/GenericCollectionTypeResolver.java b/org.springframework.core/src/main/java/org/springframework/core/GenericCollectionTypeResolver.java index 402b9961129..8c21ee6b761 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/GenericCollectionTypeResolver.java +++ b/org.springframework.core/src/main/java/org/springframework/core/GenericCollectionTypeResolver.java @@ -341,9 +341,16 @@ public abstract class GenericCollectionTypeResolver { } } if (paramType instanceof WildcardType) { - Type[] lowerBounds = ((WildcardType) paramType).getLowerBounds(); - if (lowerBounds != null && lowerBounds.length > 0) { - paramType = lowerBounds[0]; + WildcardType wildcardType = (WildcardType) paramType; + Type[] upperBounds = wildcardType.getUpperBounds(); + if (upperBounds != null && upperBounds.length > 0 && !Object.class.equals(upperBounds[0])) { + paramType = upperBounds[0]; + } + else { + Type[] lowerBounds = wildcardType.getLowerBounds(); + if (lowerBounds != null && lowerBounds.length > 0 && !Object.class.equals(lowerBounds[0])) { + paramType = lowerBounds[0]; + } } } if (paramType instanceof ParameterizedType) { diff --git a/org.springframework.core/src/test/java/org/springframework/core/GenericCollectionTypeResolverTests.java b/org.springframework.core/src/test/java/org/springframework/core/GenericCollectionTypeResolverTests.java index 9840fb60b5b..d86ed5ebb65 100644 --- a/org.springframework.core/src/test/java/org/springframework/core/GenericCollectionTypeResolverTests.java +++ b/org.springframework.core/src/test/java/org/springframework/core/GenericCollectionTypeResolverTests.java @@ -40,7 +40,7 @@ public class GenericCollectionTypeResolverTests extends AbstractGenericsTests { this.targetClass = Foo.class; this.methods = new String[] {"a", "b", "b2", "b3", "c", "d", "d2", "d3", "e", "e2", "e3"}; this.expectedResults = new Class[] { - Integer.class, null, null, Set.class, null, Integer.class, + Integer.class, null, Set.class, Set.class, null, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class}; }