public EitherTypeAdapter(Gson gson, TypeToken<Either<L, R>> typeToken, Predicate<JsonElement> leftChecker, Predicate<JsonElement> rightChecker) { this.typeToken = typeToken; Type[] elementTypes = TypeUtils.getElementTypes(typeToken, Either.class); this.left = new EitherTypeArgument<L>(gson, elementTypes[0]); this.right = new EitherTypeArgument<R>(gson, elementTypes[1]); this.leftChecker = leftChecker; this.rightChecker = rightChecker; }
/** * Determine the actual type arguments of the given type token with regard to the given target type. */ public static Type[] getElementTypes(TypeToken<?> typeToken, Class<?> targetType) { return getElementTypes(typeToken.getType(), typeToken.getRawType(), targetType); }
/** * Determine the actual type arguments of the given type token with regard to the given target type. */ public static Type[] getElementTypes(TypeToken<?> typeToken, Class<?> targetType) { return getElementTypes(typeToken.getType(), typeToken.getRawType(), targetType); }
public EitherTypeAdapter(Gson gson, TypeToken<Either<L, R>> typeToken, Predicate<JsonElement> leftChecker, Predicate<JsonElement> rightChecker) { this.typeToken = typeToken; Type[] elementTypes = TypeUtils.getElementTypes(typeToken, Either.class); this.left = new EitherTypeArgument<L>(gson, elementTypes[0]); this.right = new EitherTypeArgument<R>(gson, elementTypes[1]); this.leftChecker = leftChecker; this.rightChecker = rightChecker; }
Type genericInterface = rawType.getGenericInterfaces()[i]; Type mappedInterface = getMappedType(genericInterface, varMapping); return getElementTypes(mappedInterface, interfaces[i], targetType); Type genericSuperclass = rawType.getGenericSuperclass(); Type mappedSuperclass = getMappedType(genericSuperclass, varMapping); return getElementTypes(mappedSuperclass, rawSupertype, targetType);
Type genericInterface = rawType.getGenericInterfaces()[i]; Type mappedInterface = getMappedType(genericInterface, varMapping); return getElementTypes(mappedInterface, interfaces[i], targetType); Type genericSuperclass = rawType.getGenericSuperclass(); Type mappedSuperclass = getMappedType(genericSuperclass, varMapping); return getElementTypes(mappedSuperclass, rawSupertype, targetType);
protected void assertElementTypes(TypeToken<?> typeToken, Class<?> targetType, Type... expectedElementTypes) { Type[] actualElementTypes = TypeUtils.getElementTypes(typeToken, targetType); Assert.assertArrayEquals(expectedElementTypes, actualElementTypes); }
@Override @SuppressWarnings({ "unchecked" }) public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { if (!Collection.class.isAssignableFrom(typeToken.getRawType())) return null; Type[] elementTypes = TypeUtils.getElementTypes(typeToken, Collection.class); if (elementTypes.length != 1) return null; Type elementType = elementTypes[0]; TypeAdapter<?> elementTypeAdapter; if (elementType == Object.class) elementTypeAdapter = new JsonElementTypeAdapter(gson); else elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType)); Supplier<Collection<Object>> constructor = getConstructor((Class<Collection<Object>>) typeToken.getRawType()); return (TypeAdapter<T>) create(gson, elementType, elementTypeAdapter, constructor); }
@Override @SuppressWarnings({ "unchecked" }) public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { if (!Collection.class.isAssignableFrom(typeToken.getRawType())) return null; Type[] elementTypes = TypeUtils.getElementTypes(typeToken, Collection.class); if (elementTypes.length != 1) return null; Type elementType = elementTypes[0]; TypeAdapter<?> elementTypeAdapter; if (elementType == Object.class) elementTypeAdapter = new JsonElementTypeAdapter(gson); else elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType)); Supplier<Collection<Object>> constructor = getConstructor((Class<Collection<Object>>) typeToken.getRawType()); return (TypeAdapter<T>) create(gson, elementType, elementTypeAdapter, constructor); }