Author: timothyjward
Date: Wed Feb 20 15:01:45 2019
New Revision: 1853965

URL: http://svn.apache.org/viewvc?rev=1853965&view=rev
Log:
FELIX-6065 Support the use of wildcard types in conversions

Modified:
    
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
    
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java

Modified: 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java?rev=1853965&r1=1853964&r2=1853965&view=diff
==============================================================================
--- 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
 (original)
+++ 
felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/ConvertingImpl.java
 Wed Feb 20 15:01:45 2019
@@ -28,6 +28,7 @@ import java.lang.reflect.ParameterizedTy
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -133,6 +134,20 @@ class ConvertingImpl extends AbstractSpe
        @SuppressWarnings("unchecked")
        @Override
        public Object to(Type type) {
+               // Wildcard types are strange - we immediately resolve them to 
something
+               // that we can actually use.
+               if (type instanceof WildcardType) {
+                       WildcardType wt = (WildcardType) type;
+                       Type[] lowerBounds = wt.getLowerBounds();
+                       if(lowerBounds.length != 0) {
+                               // This is a ? super X generic, why on earth 
would you do this?
+                               throw new ConversionException("The authors of 
this implementation have no idea what to do with the type variable " + 
+                               wt.getTypeName() + ". The use of <? super ...> 
is highly ambiguous for the converter");
+                       } else {
+                               type = wt.getUpperBounds()[0];
+                       }
+               }
+               
                Class< ? > cls = null;
                if (type instanceof Class) {
                        cls = (Class< ? >) type;

Modified: 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java?rev=1853965&r1=1853964&r2=1853965&view=diff
==============================================================================
--- 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
 (original)
+++ 
felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/ConverterTest.java
 Wed Feb 20 15:01:45 2019
@@ -682,6 +682,27 @@ public class ConverterTest {
        assertEquals("myValue", m.get("myProp"));
     }
 
+    @Test
+    public void testDTO2Map5() {
+       MyDTO3 dto = new MyDTO3();
+       dto.charSet = new HashSet<>(Arrays.asList('f', 'o', 'o'));
+       
+       @SuppressWarnings("rawtypes")
+       Map m = converter.convert(dto).to(new TypeReference<Map<String, ?>>() 
{});
+       assertEquals(1, m.size());
+       assertEquals(dto.charSet, m.get("charSet"));
+
+       m = converter.convert(dto).to(new TypeReference<Map<String, ? extends 
List<String>>>() {});
+       assertEquals(1, m.size());
+       
+       List<String> list = new ArrayList<>();
+       for (Character character : dto.charSet) {
+                       list.add(String.valueOf(character));
+               }
+       
+       assertEquals(list, m.get("charSet"));
+    }
+
     @Test @SuppressWarnings({ "rawtypes", "unchecked" })
     public void testDTOFieldShadowing() {
         MySubDTO dto = new MySubDTO();


Reply via email to