Performs a coercion from an input type to a desired output type. When the target type is a primitive, the actual conversion will be to the equivalent wrapper type. In some cases, the TypeCoercer will need to search for an appropriate coercion, and may even combine existing coercions to form new ones; in those cases, the results of the search are cached.
The TypeCoercer also caches the results of a coercion search.
@param < S> source type (input)
@param < T> target type (output)
@param input
@param targetType defines the target type
@return the coerced value
@throws RuntimeException if the input can not be coerced