From c29e75cf0b2b2aede7769dacde469d40149efe67 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 11 Nov 2020 11:45:31 +0100 Subject: [PATCH] [jOOQ/jOOQ#10910] java.lang.ClassCastException: class java.lang.Class cannot be cast to class java.lang.reflect.ParameterizedType in Kotlin --- .../org/jooq/impl/DefaultRecordMapper.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java index 5987c285ae..28f9274c57 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRecordMapper.java @@ -63,6 +63,7 @@ import java.lang.reflect.Modifier; import java.lang.reflect.Parameter; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Proxy; +import java.lang.reflect.Type; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; @@ -832,16 +833,12 @@ public class DefaultRecordMapper implements RecordMapper mType = method.getParameterTypes()[0]; Object value = record.get(i, mType); - // [#3082] Map nested collection types - if (value instanceof Collection && List.class.isAssignableFrom(mType)) { - Class componentType = (Class) ((ParameterizedType) method.getGenericParameterTypes()[0]).getActualTypeArguments()[0]; - method.invoke(result, Convert.convert((Collection) value, componentType)); - } - - // Default reference types (including arrays) - else { + // [#3082] [#10910] Try mapping nested collection types + Object list = tryConvertToList(value, mType, method.getGenericParameterTypes()[0]); + if (list != null) + method.invoke(result, list); + else method.invoke(result, record.get(i, mType)); - } } } @@ -904,19 +901,24 @@ public class DefaultRecordMapper implements RecordMapper tryConvertToList(Object value, Class mType, Type genericType) { + if (value instanceof Collection && (mType == List.class || mType == ArrayList.class) && genericType instanceof ParameterizedType) { + Class componentType = (Class) ((ParameterizedType) genericType).getActualTypeArguments()[0]; + return Convert.convert((Collection) value, componentType); + } + else + return null; + } + private final void map(Object value, Object result, java.lang.reflect.Field member) throws IllegalAccessException { Class mType = member.getType();