Skip to content

Commit f6d8749

Browse files
imagejanhinerm
authored andcommittedJan 19, 2021
Fix Types.raw for GenericArrayType
Also add minimal test for array types with generics. See #415
1 parent afe795a commit f6d8749

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed
 

‎src/main/java/org/scijava/util/Types.java

+2
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ public static String name(final Type t) {
365365
public static Class<?> raw(final Type type) {
366366
if (type == null) return null;
367367
if (type instanceof Class) return (Class<?>) type;
368+
if (type instanceof GenericArrayType)
369+
return array(raw(((GenericArrayType) type).getGenericComponentType()));
368370
final List<Class<?>> c = raws(type);
369371
if (c == null || c.size() == 0) return null;
370372
return c.get(0);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.scijava.util;
2+
3+
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertFalse;
5+
import static org.junit.Assert.assertSame;
6+
import static org.junit.Assert.assertTrue;
7+
8+
import java.lang.reflect.Field;
9+
import java.lang.reflect.GenericArrayType;
10+
import java.lang.reflect.Type;
11+
import java.util.List;
12+
13+
import org.junit.Test;
14+
15+
public class GenericArrayTypesTest {
16+
17+
@Test
18+
public void testArrayFields() throws NoSuchFieldException, SecurityException {
19+
Field rawField = Types.field(ClassWithFields.class, "rawListArray");
20+
Field genericWildcardField = Types.field(ClassWithFields.class, "wildcardListArray");
21+
Field genericTypedField = Types.field(ClassWithFields.class, "integerListArray");
22+
23+
Type rawFieldType = Types.fieldType(rawField, ClassWithFields.class);
24+
Type genericWildcardFieldType = Types.fieldType(genericWildcardField, ClassWithFields.class);
25+
Type genericTypedFieldType = Types.fieldType(genericTypedField, ClassWithFields.class);
26+
27+
// raw type
28+
assertFalse(rawFieldType instanceof GenericArrayType);
29+
assertTrue(rawFieldType instanceof Class);
30+
31+
// generic array types
32+
assertTrue(genericWildcardFieldType instanceof GenericArrayType);
33+
assertTrue(genericTypedFieldType instanceof GenericArrayType);
34+
35+
assertEquals(rawField.getGenericType(), rawFieldType);
36+
assertEquals(genericWildcardField.getGenericType(), genericWildcardFieldType);
37+
assertEquals(genericTypedField.getGenericType(), genericTypedFieldType);
38+
39+
assertSame(List[].class, Types.raw(rawFieldType));
40+
assertSame(List[].class, Types.raw(genericWildcardFieldType));
41+
assertSame(List[].class, Types.raw(genericTypedFieldType));
42+
}
43+
44+
@SuppressWarnings({ "rawtypes", "unused" })
45+
private static class ClassWithFields {
46+
public List[] rawListArray;
47+
public List<?>[] wildcardListArray;
48+
public List<Integer>[] integerListArray;
49+
}
50+
}

0 commit comments

Comments
 (0)