This commit is contained in:
@@ -208,6 +208,12 @@ public abstract class TypeToken<T> {
|
|||||||
if (declaringClass instanceof Class) {
|
if (declaringClass instanceof Class) {
|
||||||
declaringClass0 = (Class) declaringClass;
|
declaringClass0 = (Class) declaringClass;
|
||||||
superType = declaringClass0.getGenericSuperclass();
|
superType = declaringClass0.getGenericSuperclass();
|
||||||
|
if (superType instanceof ParameterizedType) {
|
||||||
|
Map<Type, Type> 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();
|
while (superType instanceof Class && superType != Object.class) superType = ((Class) superType).getGenericSuperclass();
|
||||||
} else if (declaringClass instanceof ParameterizedType) {
|
} else if (declaringClass instanceof ParameterizedType) {
|
||||||
superType = declaringClass;
|
superType = declaringClass;
|
||||||
@@ -305,6 +311,30 @@ public abstract class TypeToken<T> {
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Type getType(Map<Type, Type> map, Type type) {
|
||||||
|
Type one = map.get(type);
|
||||||
|
if (one == null) return type;
|
||||||
|
return getType(map, one);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<Type, Type> parseType(Map<Type, Type> 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
|
* 动态创建类型为ParameterizedType或Class的Type
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user