From a639bccb316da32c7060ececfa916859fefcf87e Mon Sep 17 00:00:00 2001 From: Gabriel Selzer Date: Tue, 13 Dec 2022 14:38:22 -0600 Subject: [PATCH] Only convert to array types when it is possible --- .../java/org/scijava/convert/DefaultConverter.java | 12 +++++++++++- .../java/org/scijava/convert/ConvertServiceTest.java | 5 +++-- .../java/org/scijava/util/ConversionUtilsTest.java | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/scijava/convert/DefaultConverter.java b/src/main/java/org/scijava/convert/DefaultConverter.java index d2daea418..b399f7596 100644 --- a/src/main/java/org/scijava/convert/DefaultConverter.java +++ b/src/main/java/org/scijava/convert/DefaultConverter.java @@ -292,7 +292,17 @@ private Collection createCollection(final Class type) { public boolean canConvert(final Class src, final Type dest) { // Handle array types, including generic array types. - if (isArray(dest)) return true; + // The logic follows from the types that ArrayUtils.toCollection + // can convert + if (isArray(dest)){ + // toCollection handles any type of Collection + if (Collection.class.isAssignableFrom(src)) return true; + // toCollection handles any type of array + if (src.isArray()) return true; + // toCollection can wrap objects into a Singleton list, + // but we only want to wrap up a T if the dest type is a T[]. + return Types.isAssignable(src, Types.component(dest)); + } // Handle parameterized collection types. if (dest instanceof ParameterizedType && isCollection(dest) && diff --git a/src/test/java/org/scijava/convert/ConvertServiceTest.java b/src/test/java/org/scijava/convert/ConvertServiceTest.java index cca1b2acc..59aaa2835 100644 --- a/src/test/java/org/scijava/convert/ConvertServiceTest.java +++ b/src/test/java/org/scijava/convert/ConvertServiceTest.java @@ -457,7 +457,7 @@ class Struct { /** * Tests setting an incompatible element value for a primitive array. */ - @Test(expected = IllegalArgumentException.class) + @Test public void testBadPrimitiveArray() { class Struct { @@ -467,6 +467,7 @@ class Struct { final Struct struct = new Struct(); setFieldValue(struct, "intArray", "not an int array"); + assertEquals(null, struct.intArray); } /** @@ -486,7 +487,7 @@ class Struct { // Test abnormal behavior for an object array setFieldValue(struct, "doubleArray", "not a double array"); - assertEquals(null, struct.doubleArray[0]); + assertEquals(null, struct.doubleArray); // Test abnormal behavior for a list setFieldValue(struct, "nestedArray", "definitely not a set of char arrays"); diff --git a/src/test/java/org/scijava/util/ConversionUtilsTest.java b/src/test/java/org/scijava/util/ConversionUtilsTest.java index d04118628..ac0abeaa9 100644 --- a/src/test/java/org/scijava/util/ConversionUtilsTest.java +++ b/src/test/java/org/scijava/util/ConversionUtilsTest.java @@ -237,7 +237,6 @@ class Struct { /** * Tests setting an incompatible element value for a primitive array. */ - @Test(expected = IllegalArgumentException.class) public void testBadPrimitiveArray() { class Struct { @@ -247,6 +246,7 @@ class Struct { final Struct struct = new Struct(); setFieldValue(struct, "intArray", "not an int array"); + assertEquals(null, struct.intArray); } /** @@ -266,7 +266,7 @@ class Struct { // Test abnormal behavior for an object array setFieldValue(struct, "doubleArray", "not a double array"); - assertEquals(null, struct.doubleArray[0]); + assertEquals(null, struct.doubleArray); // Test abnormal behavior for a list setFieldValue(struct, "nestedArray", "definitely not a set of char arrays");