All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fasterxml.jackson.core.type.TypeReference Maven / Gradle / Ivy

package com.fasterxml.jackson.core.type;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * This generic abstract class is used for obtaining full generics type information
 * by sub-classing; it must be converted to {@link ResolvedType} implementation
 * (implemented by JavaType from "databind" bundle) to be used.
 * Class is based on ideas from
 * http://gafter.blogspot.com/2006/12/super-type-tokens.html,
 * Additional idea (from a suggestion made in comments of the article)
 * is to require bogus implementation of Comparable
 * (any such generic interface would do, as long as it forces a method
 * with generic type to be implemented).
 * to ensure that a Type argument is indeed given.
 *

* Usage is by sub-classing: here is one way to instantiate reference * to generic type List<Integer>: *

 *  TypeReference ref = new TypeReference<List<Integer>>() { };
 *
* which can be passed to methods that accept TypeReference, or resolved * using TypeFactory to obtain {@link ResolvedType}. */ public abstract class TypeReference implements Comparable> { protected final Type _type; protected TypeReference() { Type superClass = getClass().getGenericSuperclass(); if (superClass instanceof Class) { // sanity check, should never happen throw new IllegalArgumentException("Internal error: TypeReference constructed without actual type information"); } /* 22-Dec-2008, tatu: Not sure if this case is safe -- I suspect * it is possible to make it fail? * But let's deal with specific * case when we know an actual use case, and thereby suitable * workarounds for valid case(s) and/or error to throw * on invalid one(s). */ _type = ((ParameterizedType) superClass).getActualTypeArguments()[0]; } public Type getType() { return _type; } /** * The only reason we define this method (and require implementation * of Comparable) is to prevent constructing a * reference without type information. */ // @Override public int compareTo(TypeReference o) { // just need an implementation, not a good one... hence: return 0; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy