Class TypeResolver

java.lang.Object
com.google.common.reflect.TypeResolver

public final class TypeResolver extends Object
An object of this class encapsulates type mappings from type variables. Mappings are established with where(java.lang.reflect.Type, java.lang.reflect.Type) and types are resolved using resolveType(java.lang.reflect.Type).

Note that usually type mappings are already implied by the static type hierarchy (for example, the E type variable declared by class List naturally maps to String in the context of class MyStringList implements List<String>). In such case, prefer to use TypeToken.resolveType(java.lang.reflect.Type) since it's simpler and more type safe. This class should only be used when the type mapping isn't implied by the static type hierarchy, but provided through other means such as an annotation or external configuration file.

Since:
15.0
  • Field Details

  • Constructor Details

  • Method Details

    • covariantly

      static TypeResolver covariantly(Type contextType)
      Returns a resolver that resolves types "covariantly".

      For example, when resolving List<T> in the context of ArrayList<?>, <T> is covariantly resolved to <?> such that return type of List::get is <?>.

    • invariantly

      static TypeResolver invariantly(Type contextType)
      Returns a resolver that resolves types "invariantly".

      For example, when resolving List<T> in the context of ArrayList<?>, <T> cannot be invariantly resolved to <?> because otherwise the parameter type of List::set will be <?> and it'll falsely say any object can be passed into ArrayList<?>::set.

      Instead, <?> will be resolved to a capture in the form of a type variable <capture-of-? extends Object>, effectively preventing set from accepting any type.

    • where

      public TypeResolver where(Type formal, Type actual)
      Returns a new TypeResolver with type variables in formal mapping to types in actual.

      For example, if formal is a TypeVariable T, and actual is String.class, then new TypeResolver().where(formal, actual) will resolve ParameterizedType List<T> to List<String>, and resolve Map<T, Something> to Map<String, Something> etc. Similarly, formal and actual can be Map<K, V> and Map<String, Integer> respectively, or they can be E[] and String[] respectively, or even any arbitrary combination thereof.

      Parameters:
      formal - The type whose type variables or itself is mapped to other type(s). It's almost always a bug if formal isn't a type variable and contains no type variable. Make sure you are passing the two parameters in the right order.
      actual - The type that the formal type variable(s) are mapped to. It can be or contain yet other type variables, in which case these type variables will be further resolved if corresponding mappings exist in the current TypeResolver instance.
    • where

      TypeResolver where(Map<TypeResolver.TypeVariableKey,? extends Type> mappings)
      Returns a new TypeResolver with variable mapping to type.
    • populateTypeMappings

      private static void populateTypeMappings(Map<TypeResolver.TypeVariableKey,Type> mappings, Type from, Type to)
    • resolveType

      public Type resolveType(Type type)
      Resolves all type variables in type and all downstream types and returns a corresponding type with type variables resolved.
    • resolveTypesInPlace

      Type[] resolveTypesInPlace(Type[] types)
    • resolveTypes

      private Type[] resolveTypes(Type[] types)
    • resolveWildcardType

      private WildcardType resolveWildcardType(WildcardType type)
    • resolveGenericArrayType

      private Type resolveGenericArrayType(GenericArrayType type)
    • resolveParameterizedType

      private ParameterizedType resolveParameterizedType(ParameterizedType type)
    • expectArgument

      private static <T> T expectArgument(Class<T> type, Object arg)