package tc.oc.commons.core.reflect; import com.google.common.reflect.TypeToken; import com.google.inject.TypeLiteral; public class TypeResolver { private final com.google.common.reflect.TypeResolver resolver; public TypeResolver() { this(new com.google.common.reflect.TypeResolver()); } public TypeResolver(com.google.common.reflect.TypeResolver resolver) { this.resolver = resolver; } public <T> TypeResolver where(Class<T> variable, Class<? extends T> actual) { return new TypeResolver(resolver.where(variable, actual)); } public <T> TypeResolver where(TypeToken<T> variable, TypeToken<? extends T> actual) { return new TypeResolver(resolver.where(variable.getType(), actual.getType())); } public <T> TypeResolver where(TypeParameter<T> variable, TypeToken<? extends T> actual) { return new TypeResolver(resolver.where(variable, actual.getType())); } public <T> TypeResolver where(TypeLiteral<T> variable, TypeLiteral<? extends T> actual) { return new TypeResolver(resolver.where(variable.getType(), actual.getType())); } public <T> TypeResolver where(TypeParameter<T> variable, TypeLiteral<? extends T> actual) { return new TypeResolver(resolver.where(variable, actual.getType())); } public <T> TypeLiteral<T> resolve(TypeLiteral<T> type) { return (TypeLiteral<T>) TypeLiteral.get(resolver.resolveType(type.getType())); } public <T> TypeToken<T> resolve(TypeToken<T> type) { return (TypeToken<T>) TypeToken.of(resolver.resolveType(type.getType())); } }