private static Type getMappedType(Type type, Map<String, Type> varMapping) { if (type instanceof TypeVariable) { String name = ((TypeVariable<?>) type).getName(); if (varMapping.containsKey(name)) return varMapping.get(name); } if (type instanceof WildcardType) { return getMappedType(((WildcardType) type).getUpperBounds()[0], varMapping); } if (type instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) type; Type[] origArgs = pt.getActualTypeArguments(); Type[] mappedArgs = new Type[origArgs.length]; for (int i = 0; i < origArgs.length; i++) { mappedArgs[i] = getMappedType(origArgs[i], varMapping); } return new ParameterizedTypeImpl(pt, mappedArgs); } return type; }
private static Type getMappedType(Type type, Map<String, Type> varMapping) { if (type instanceof TypeVariable) { String name = ((TypeVariable<?>) type).getName(); if (varMapping.containsKey(name)) return varMapping.get(name); } if (type instanceof WildcardType) { return getMappedType(((WildcardType) type).getUpperBounds()[0], varMapping); } if (type instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) type; Type[] origArgs = pt.getActualTypeArguments(); Type[] mappedArgs = new Type[origArgs.length]; for (int i = 0; i < origArgs.length; i++) { mappedArgs[i] = getMappedType(origArgs[i], varMapping); } return new ParameterizedTypeImpl(pt, mappedArgs); } return type; }
else mappedType = getMappedType(type, Collections.emptyMap()); return ((ParameterizedType) mappedType).getActualTypeArguments(); if (Collection.class.isAssignableFrom(interfaces[i])) { Type genericInterface = rawType.getGenericInterfaces()[i]; Type mappedInterface = getMappedType(genericInterface, varMapping); return getElementTypes(mappedInterface, interfaces[i], targetType); if (targetType.isAssignableFrom(rawSupertype)) { Type genericSuperclass = rawType.getGenericSuperclass(); Type mappedSuperclass = getMappedType(genericSuperclass, varMapping); return getElementTypes(mappedSuperclass, rawSupertype, targetType);
else mappedType = getMappedType(type, Collections.emptyMap()); return ((ParameterizedType) mappedType).getActualTypeArguments(); if (Collection.class.isAssignableFrom(interfaces[i])) { Type genericInterface = rawType.getGenericInterfaces()[i]; Type mappedInterface = getMappedType(genericInterface, varMapping); return getElementTypes(mappedInterface, interfaces[i], targetType); if (targetType.isAssignableFrom(rawSupertype)) { Type genericSuperclass = rawType.getGenericSuperclass(); Type mappedSuperclass = getMappedType(genericSuperclass, varMapping); return getElementTypes(mappedSuperclass, rawSupertype, targetType);