提交 109eaf3a 编写于 作者: J Juergen Hoeller

DefaultConversionService properly converts Object[] to int[]

Closes gh-22410
上级 3e1b3c32
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 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.
......@@ -20,6 +20,7 @@ import org.springframework.core.convert.ConversionFailedException;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.GenericConverter;
import org.springframework.util.ClassUtils;
/**
* Internal utilities for the conversion package.
......@@ -59,7 +60,7 @@ abstract class ConversionUtils {
// yes
return true;
}
if (sourceElementType.getType().isAssignableFrom(targetElementType.getType())) {
if (ClassUtils.isAssignable(sourceElementType.getType(), targetElementType.getType())) {
// maybe
return true;
}
......
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2019 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.
......@@ -133,7 +133,7 @@ public class DefaultConversionServiceTests {
}
@Test
public void testStringToByte() throws Exception {
public void testStringToByte() {
assertEquals(Byte.valueOf("1"), conversionService.convert("1", Byte.class));
}
......@@ -155,7 +155,7 @@ public class DefaultConversionServiceTests {
@Test
public void testStringToInteger() {
assertEquals(Integer.valueOf("1"), conversionService.convert("1", Integer.class));
assertEquals(Integer.valueOf(1), conversionService.convert("1", Integer.class));
}
@Test
......@@ -165,7 +165,7 @@ public class DefaultConversionServiceTests {
@Test
public void testStringToLong() {
assertEquals(Long.valueOf("1"), conversionService.convert("1", Long.class));
assertEquals(Long.valueOf(1), conversionService.convert("1", Long.class));
}
@Test
......@@ -180,7 +180,7 @@ public class DefaultConversionServiceTests {
@Test
public void testFloatToString() {
assertEquals("1.0", conversionService.convert(new Float("1.0"), String.class));
assertEquals("1.0", conversionService.convert(Float.valueOf("1.0"), String.class));
}
@Test
......@@ -190,7 +190,7 @@ public class DefaultConversionServiceTests {
@Test
public void testDoubleToString() {
assertEquals("1.0", conversionService.convert(new Double("1.0"), String.class));
assertEquals("1.0", conversionService.convert(Double.valueOf("1.0"), String.class));
}
@Test
......@@ -224,12 +224,12 @@ public class DefaultConversionServiceTests {
}
@Test
public void testStringToEnum() throws Exception {
public void testStringToEnum() {
assertEquals(Foo.BAR, conversionService.convert("BAR", Foo.class));
}
@Test
public void testStringToEnumWithSubclass() throws Exception {
public void testStringToEnumWithSubclass() {
assertEquals(SubFoo.BAZ, conversionService.convert("BAZ", SubFoo.BAR.getClass()));
}
......@@ -244,12 +244,12 @@ public class DefaultConversionServiceTests {
}
@Test
public void testIntegerToEnum() throws Exception {
public void testIntegerToEnum() {
assertEquals(Foo.BAR, conversionService.convert(0, Foo.class));
}
@Test
public void testIntegerToEnumWithSubclass() throws Exception {
public void testIntegerToEnumWithSubclass() {
assertEquals(SubFoo.BAZ, conversionService.convert(1, SubFoo.BAR.getClass()));
}
......@@ -325,7 +325,7 @@ public class DefaultConversionServiceTests {
@Test
public void testCharacterToNumber() {
assertEquals(new Integer(65), conversionService.convert('A', Integer.class));
assertEquals(Integer.valueOf(65), conversionService.convert('A', Integer.class));
}
// collection conversion
......@@ -343,9 +343,9 @@ public class DefaultConversionServiceTests {
@SuppressWarnings("unchecked")
List<Integer> result = (List<Integer>) conversionService.convert(new String[] {"1", "2", "3"}, TypeDescriptor
.valueOf(String[].class), new TypeDescriptor(getClass().getDeclaredField("genericList")));
assertEquals(new Integer("1"), result.get(0));
assertEquals(new Integer("2"), result.get(1));
assertEquals(new Integer("3"), result.get(2));
assertEquals(Integer.valueOf(1), result.get(0));
assertEquals(Integer.valueOf(2), result.get(1));
assertEquals(Integer.valueOf(3), result.get(2));
}
@Test
......@@ -384,10 +384,6 @@ public class DefaultConversionServiceTests {
conversionService.convert(new String[]{"1", "2", "3"}, AbstractList.class);
}
public static enum FooEnum {
BAR, BAZ
}
@Test
public void convertArrayToString() {
String result = conversionService.convert(new String[] {"1", "2", "3"}, String.class);
......@@ -419,9 +415,9 @@ public class DefaultConversionServiceTests {
public void convertStringToArrayWithElementConversion() {
Integer[] result = conversionService.convert("1,2,3", Integer[].class);
assertEquals(3, result.length);
assertEquals(new Integer(1), result[0]);
assertEquals(new Integer(2), result[1]);
assertEquals(new Integer(3), result[2]);
assertEquals(Integer.valueOf(1), result[0]);
assertEquals(Integer.valueOf(2), result[1]);
assertEquals(Integer.valueOf(3), result[2]);
}
@Test
......@@ -450,7 +446,7 @@ public class DefaultConversionServiceTests {
public void convertArrayToObjectWithElementConversion() {
String[] array = new String[] {"3"};
Integer result = conversionService.convert(array, Integer.class);
assertEquals(new Integer(3), result);
assertEquals(Integer.valueOf(3), result);
}
@Test
......@@ -471,12 +467,12 @@ public class DefaultConversionServiceTests {
public void convertObjectToArrayWithElementConversion() {
Integer[] result = conversionService.convert(3L, Integer[].class);
assertEquals(1, result.length);
assertEquals(new Integer(3), result[0]);
assertEquals(Integer.valueOf(3), result[0]);
}
@Test
public void convertCollectionToArray() {
List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
......@@ -488,14 +484,14 @@ public class DefaultConversionServiceTests {
@Test
public void convertCollectionToArrayWithElementConversion() {
List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
Integer[] result = conversionService.convert(list, Integer[].class);
assertEquals(new Integer(1), result[0]);
assertEquals(new Integer(2), result[1]);
assertEquals(new Integer(3), result[2]);
assertEquals(Integer.valueOf(1), result[0]);
assertEquals(Integer.valueOf(2), result[1]);
assertEquals(Integer.valueOf(3), result[2]);
}
@Test
......@@ -514,9 +510,8 @@ public class DefaultConversionServiceTests {
}
@Test
@SuppressWarnings("rawtypes")
public void convertStringToCollection() {
List result = conversionService.convert("1,2,3", List.class);
List<?> result = conversionService.convert("1,2,3", List.class);
assertEquals(3, result.size());
assertEquals("1", result.get(0));
assertEquals("2", result.get(1));
......@@ -524,9 +519,8 @@ public class DefaultConversionServiceTests {
}
@Test
@SuppressWarnings("rawtypes")
public void convertStringToCollectionWithElementConversion() throws Exception {
List result = (List) conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class),
List<?> result = (List) conversionService.convert("1,2,3", TypeDescriptor.valueOf(String.class),
new TypeDescriptor(getClass().getField("genericList")));
assertEquals(3, result.size());
assertEquals(1, result.get(0));
......@@ -535,9 +529,8 @@ public class DefaultConversionServiceTests {
}
@Test
@SuppressWarnings("rawtypes")
public void convertEmptyStringToCollection() {
Collection result = conversionService.convert("", Collection.class);
Collection<?> result = conversionService.convert("", Collection.class);
assertEquals(0, result.size());
}
......@@ -545,44 +538,37 @@ public class DefaultConversionServiceTests {
public void convertCollectionToObject() {
List<Long> list = Collections.singletonList(3L);
Long result = conversionService.convert(list, Long.class);
assertEquals(new Long(3), result);
assertEquals(Long.valueOf(3), result);
}
@Test
public void convertCollectionToObjectWithElementConversion() {
List<String> list = Collections.singletonList("3");
Integer result = conversionService.convert(list, Integer.class);
assertEquals(new Integer(3), result);
assertEquals(Integer.valueOf(3), result);
}
@Test
public void convertCollectionToObjectAssignableTarget() throws Exception {
Collection<String> source = new ArrayList<String>();
Collection<String> source = new ArrayList<>();
source.add("foo");
Object result = conversionService.convert(source, new TypeDescriptor(getClass().getField("assignableTarget")));
assertEquals(source, result);
}
@Test
@SuppressWarnings("rawtypes")
public void convertCollectionToObjectWithCustomConverter() throws Exception {
List<String> source = new ArrayList<String>();
public void convertCollectionToObjectWithCustomConverter() {
List<String> source = new ArrayList<>();
source.add("A");
source.add("B");
conversionService.addConverter(new Converter<List, ListWrapper>() {
@Override
public ListWrapper convert(List source) {
return new ListWrapper(source);
}
});
conversionService.addConverter(List.class, ListWrapper.class, ListWrapper::new);
ListWrapper result = conversionService.convert(source, ListWrapper.class);
assertSame(source, result.getList());
}
@Test
@SuppressWarnings("rawtypes")
public void convertObjectToCollection() {
List result = conversionService.convert(3L, List.class);
List<?> result = conversionService.convert(3L, List.class);
assertEquals(1, result.size());
assertEquals(3L, result.get(0));
}
......@@ -593,19 +579,19 @@ public class DefaultConversionServiceTests {
List<Integer> result = (List<Integer>) conversionService.convert(3L, TypeDescriptor.valueOf(Long.class),
new TypeDescriptor(getClass().getField("genericList")));
assertEquals(1, result.size());
assertEquals(new Integer(3), result.get(0));
assertEquals(Integer.valueOf(3), result.get(0));
}
@Test
public void convertArrayToArray() {
public void convertStringArrayToIntegerArray() {
Integer[] result = conversionService.convert(new String[] {"1", "2", "3"}, Integer[].class);
assertEquals(new Integer(1), result[0]);
assertEquals(new Integer(2), result[1]);
assertEquals(new Integer(3), result[2]);
assertEquals(Integer.valueOf(1), result[0]);
assertEquals(Integer.valueOf(2), result[1]);
assertEquals(Integer.valueOf(3), result[2]);
}
@Test
public void convertArrayToPrimitiveArray() {
public void convertStringArrayToIntArray() {
int[] result = conversionService.convert(new String[] {"1", "2", "3"}, int[].class);
assertEquals(1, result[0]);
assertEquals(2, result[1]);
......@@ -613,7 +599,39 @@ public class DefaultConversionServiceTests {
}
@Test
public void convertArrayToWrapperArray() {
public void convertIntegerArrayToIntegerArray() {
Integer[] result = conversionService.convert(new Integer[] {1, 2, 3}, Integer[].class);
assertEquals(Integer.valueOf(1), result[0]);
assertEquals(Integer.valueOf(2), result[1]);
assertEquals(Integer.valueOf(3), result[2]);
}
@Test
public void convertIntegerArrayToIntArray() {
int[] result = conversionService.convert(new Integer[] {1, 2, 3}, int[].class);
assertEquals(1, result[0]);
assertEquals(2, result[1]);
assertEquals(3, result[2]);
}
@Test
public void convertObjectArrayToIntegerArray() {
Integer[] result = conversionService.convert(new Object[] {1, 2, 3}, Integer[].class);
assertEquals(Integer.valueOf(1), result[0]);
assertEquals(Integer.valueOf(2), result[1]);
assertEquals(Integer.valueOf(3), result[2]);
}
@Test
public void convertObjectArrayToIntArray() {
int[] result = conversionService.convert(new Object[] {1, 2, 3}, int[].class);
assertEquals(1, result[0]);
assertEquals(2, result[1]);
assertEquals(3, result[2]);
}
@Test
public void convertByteArrayToWrapperArray() {
byte[] byteArray = new byte[] {1, 2, 3};
Byte[] converted = conversionService.convert(byteArray, Byte[].class);
assertThat(converted, equalTo(new Byte[]{1, 2, 3}));
......@@ -661,16 +679,16 @@ public class DefaultConversionServiceTests {
@Test
public void convertCollectionToCollection() throws Exception {
Set<String> foo = new LinkedHashSet<String>();
Set<String> foo = new LinkedHashSet<>();
foo.add("1");
foo.add("2");
foo.add("3");
@SuppressWarnings("unchecked")
List<Integer> bar = (List<Integer>) conversionService.convert(foo, TypeDescriptor.forObject(foo),
new TypeDescriptor(getClass().getField("genericList")));
assertEquals(new Integer(1), bar.get(0));
assertEquals(new Integer(2), bar.get(1));
assertEquals(new Integer(3), bar.get(2));
assertEquals(Integer.valueOf(1), bar.get(0));
assertEquals(Integer.valueOf(2), bar.get(1));
assertEquals(Integer.valueOf(3), bar.get(2));
}
@Test
......@@ -683,8 +701,8 @@ public class DefaultConversionServiceTests {
@Test
@SuppressWarnings("rawtypes")
public void convertCollectionToCollectionNotGeneric() throws Exception {
Set<String> foo = new LinkedHashSet<String>();
public void convertCollectionToCollectionNotGeneric() {
Set<String> foo = new LinkedHashSet<>();
foo.add("1");
foo.add("2");
foo.add("3");
......@@ -706,39 +724,39 @@ public class DefaultConversionServiceTests {
List<Integer> bar = (List<Integer>) conversionService.convert(values,
TypeDescriptor.forObject(values), new TypeDescriptor(getClass().getField("genericList")));
assertEquals(3, bar.size());
assertEquals(new Integer(1), bar.get(0));
assertEquals(new Integer(2), bar.get(1));
assertEquals(new Integer(3), bar.get(2));
assertEquals(Integer.valueOf(1), bar.get(0));
assertEquals(Integer.valueOf(2), bar.get(1));
assertEquals(Integer.valueOf(3), bar.get(2));
}
@Test
public void collection() {
List<String> strings = new ArrayList<String>();
List<String> strings = new ArrayList<>();
strings.add("3");
strings.add("9");
@SuppressWarnings("unchecked")
List<Integer> integers = (List<Integer>) conversionService.convert(strings,
TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(Integer.class)));
assertEquals(new Integer(3), integers.get(0));
assertEquals(new Integer(9), integers.get(1));
assertEquals(Integer.valueOf(3), integers.get(0));
assertEquals(Integer.valueOf(9), integers.get(1));
}
@Test
public void convertMapToMap() throws Exception {
Map<String, String> foo = new HashMap<String, String>();
Map<String, String> foo = new HashMap<>();
foo.put("1", "BAR");
foo.put("2", "BAZ");
@SuppressWarnings("unchecked")
Map<Integer, FooEnum> map = (Map<Integer, FooEnum>) conversionService.convert(foo,
Map<Integer, Foo> map = (Map<Integer, Foo>) conversionService.convert(foo,
TypeDescriptor.forObject(foo), new TypeDescriptor(getClass().getField("genericMap")));
assertEquals(FooEnum.BAR, map.get(1));
assertEquals(FooEnum.BAZ, map.get(2));
assertEquals(Foo.BAR, map.get(1));
assertEquals(Foo.BAZ, map.get(2));
}
@Test
@SuppressWarnings("rawtypes")
public void convertHashMapValuesToList() {
Map<String, Integer> hashMap = new LinkedHashMap<String, Integer>();
Map<String, Integer> hashMap = new LinkedHashMap<>();
hashMap.put("1", 1);
hashMap.put("2", 2);
List converted = conversionService.convert(hashMap.values(), List.class);
......@@ -747,14 +765,14 @@ public class DefaultConversionServiceTests {
@Test
public void map() {
Map<String, String> strings = new HashMap<String, String>();
Map<String, String> strings = new HashMap<>();
strings.put("3", "9");
strings.put("6", "31");
@SuppressWarnings("unchecked")
Map<Integer, Integer> integers = (Map<Integer, Integer>) conversionService.convert(strings,
TypeDescriptor.map(Map.class, TypeDescriptor.valueOf(Integer.class), TypeDescriptor.valueOf(Integer.class)));
assertEquals(new Integer(9), integers.get(3));
assertEquals(new Integer(31), integers.get(6));
assertEquals(Integer.valueOf(9), integers.get(3));
assertEquals(Integer.valueOf(31), integers.get(6));
}
@Test
......@@ -847,13 +865,13 @@ public class DefaultConversionServiceTests {
@Test(expected = ConverterNotFoundException.class)
public void convertObjectToObjectNoValueOfMethodOrConstructor() {
conversionService.convert(new Long(3), SSN.class);
conversionService.convert(Long.valueOf(3), SSN.class);
}
@Test
public void convertObjectToObjectFinderMethod() {
TestEntity e = conversionService.convert(1L, TestEntity.class);
assertEquals(new Long(1), e.getId());
assertEquals(Long.valueOf(1), e.getId());
}
@Test
......@@ -866,29 +884,24 @@ public class DefaultConversionServiceTests {
@Test
public void convertObjectToObjectFinderMethodWithIdConversion() {
TestEntity entity = conversionService.convert("1", TestEntity.class);
assertEquals(new Long(1), entity.getId());
assertEquals(Long.valueOf(1), entity.getId());
}
@Test
public void convertCharArrayToString() throws Exception {
public void convertCharArrayToString() {
String converted = conversionService.convert(new char[] {'a', 'b', 'c'}, String.class);
assertThat(converted, equalTo("a,b,c"));
}
@Test
public void convertStringToCharArray() throws Exception {
public void convertStringToCharArray() {
char[] converted = conversionService.convert("a,b,c", char[].class);
assertThat(converted, equalTo(new char[]{'a', 'b', 'c'}));
}
@Test
public void convertStringToCustomCharArray() throws Exception {
conversionService.addConverter(new Converter<String, char[]>() {
@Override
public char[] convert(String source) {
return source.toCharArray();
}
});
public void convertStringToCustomCharArray() {
conversionService.addConverter(String.class, char[].class, String::toCharArray);
char[] converted = conversionService.convert("abc", char[].class);
assertThat(converted, equalTo(new char[] {'a', 'b', 'c'}));
}
......@@ -905,16 +918,11 @@ public class DefaultConversionServiceTests {
@Test
public void convertCannotOptimizeArray() {
conversionService.addConverter(new Converter<Byte, Byte>() {
@Override
public Byte convert(Byte source) {
return (byte) (source + 1);
}
});
conversionService.addConverter(Byte.class, Byte.class, source -> (byte) (source + 1));
byte[] byteArray = new byte[] {1, 2, 3};
byte[] converted = conversionService.convert(byteArray, byte[].class);
assertNotSame(byteArray, converted);
assertTrue(Arrays.equals(new byte[] {2, 3, 4}, converted));
assertArrayEquals(new byte[]{2, 3, 4}, converted);
}
@Test
......@@ -953,7 +961,7 @@ public class DefaultConversionServiceTests {
watch.stop();
watch.start("convert 4,000,000 manually");
for (int i = 0; i < 4000000; i++) {
new Integer(3).toString();
Integer.valueOf(3).toString();
}
watch.stop();
// System.out.println(watch.prettyPrint());
......@@ -962,11 +970,11 @@ public class DefaultConversionServiceTests {
// test fields and helpers
public List<Integer> genericList = new ArrayList<Integer>();
public List<Integer> genericList = new ArrayList<>();
public Stream<Integer> genericStream;
public Map<Integer, FooEnum> genericMap = new HashMap<Integer, FooEnum>();
public Map<Integer, Foo> genericMap = new HashMap<>();
public EnumSet<Foo> enumSet;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册