Skip to content

Commit c21e17a

Browse files
committed
Fix Types.raw for GenericArrayType
Also add minimal test for array types with generics. See #415
1 parent afe795a commit c21e17a

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-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,49 @@
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.assertTrue;
6+
7+
import java.lang.reflect.Field;
8+
import java.lang.reflect.GenericArrayType;
9+
import java.lang.reflect.Type;
10+
import java.util.List;
11+
12+
import org.junit.Test;
13+
14+
public class GenericArrayTypesTest {
15+
16+
@Test
17+
public void testArrayFields() throws NoSuchFieldException, SecurityException {
18+
Field rawField = Types.field(ClassWithFields.class, "rawListArray");
19+
Field genericWildcardField = Types.field(ClassWithFields.class, "wildcardListArray");
20+
Field genericTypedField = Types.field(ClassWithFields.class, "integerListArray");
21+
22+
Type rawFieldType = Types.fieldType(rawField, ClassWithFields.class);
23+
Type genericWildcardFieldType = Types.fieldType(genericWildcardField, ClassWithFields.class);
24+
Type genericTypedFieldType = Types.fieldType(genericTypedField, ClassWithFields.class);
25+
26+
// raw type
27+
assertFalse(rawFieldType instanceof GenericArrayType);
28+
assertTrue(rawFieldType instanceof Class);
29+
30+
// generic array types
31+
assertTrue(genericWildcardFieldType instanceof GenericArrayType);
32+
assertTrue(genericTypedFieldType instanceof GenericArrayType);
33+
34+
assertEquals(rawField.getGenericType(), rawFieldType);
35+
assertEquals(genericWildcardField.getGenericType(), genericWildcardFieldType);
36+
assertEquals(genericTypedField.getGenericType(), genericTypedFieldType);
37+
38+
assertEquals(List[].class, Types.raw(rawFieldType));
39+
assertEquals(List[].class, Types.raw(genericWildcardFieldType));
40+
assertEquals(List[].class, Types.raw(genericTypedFieldType));
41+
}
42+
43+
@SuppressWarnings({ "rawtypes", "unused" })
44+
private static class ClassWithFields {
45+
public List[] rawListArray;
46+
public List<?>[] wildcardListArray;
47+
public List<Integer>[] integerListArray;
48+
}
49+
}

0 commit comments

Comments
 (0)