diff --git a/src/org/redkale/util/TypeToken.java b/src/org/redkale/util/TypeToken.java index 7892bc921..57539d45e 100644 --- a/src/org/redkale/util/TypeToken.java +++ b/src/org/redkale/util/TypeToken.java @@ -208,6 +208,12 @@ public abstract class TypeToken { if (declaringClass instanceof Class) { declaringClass0 = (Class) declaringClass; superType = declaringClass0.getGenericSuperclass(); + if (superType instanceof ParameterizedType) { + Map map = new HashMap<>(); + parseType(map, declaringClass0); + Type rstype = getType(map, type); + if (rstype instanceof Class) return rstype; + } while (superType instanceof Class && superType != Object.class) superType = ((Class) superType).getGenericSuperclass(); } else if (declaringClass instanceof ParameterizedType) { superType = declaringClass; @@ -305,6 +311,30 @@ public abstract class TypeToken { return type; } + private static Type getType(Map map, Type type) { + Type one = map.get(type); + if (one == null) return type; + return getType(map, one); + } + + private static Map parseType(Map map, Class clzz) { + if (clzz == Object.class) return map; + Type superType = clzz.getGenericSuperclass(); + if (!(superType instanceof ParameterizedType)) return map; + ParameterizedType pt = (ParameterizedType) superType; + Type[] ptt = pt.getActualTypeArguments(); + Type superRaw = pt.getRawType(); + if (!(superRaw instanceof Class)) return map; + Class superClazz = (Class) superRaw; + TypeVariable[] scs = superClazz.getTypeParameters(); + if (scs.length != ptt.length) return map; + for (int i = 0; i < scs.length; i++) { + if (scs[i] == ptt[i]) continue; + map.put(scs[i], ptt[i]); + } + return parseType(map, clzz.getSuperclass()); + } + /** * 动态创建类型为ParameterizedType或Class的Type *