You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ti...@apache.org on 2019/02/20 15:01:45 UTC
svn commit: r1853965 - in /felix/trunk/converter/converter/src:
main/java/org/osgi/util/converter/ConvertingImpl.java
test/java/org/osgi/util/converter/ConverterTest.java
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();