Created
August 28, 2015 17:39
-
-
Save sarxos/396f9d0bd85fd9ef2e80 to your computer and use it in GitHub Desktop.
Pass type reference from generic argument
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 <code>JavaType</code> from "databind" bundle) to be used. | |
| * Class is based on ideas from | |
| * <a href="http://gafter.blogspot.com/2006/12/super-type-tokens.html" | |
| * >http://gafter.blogspot.com/2006/12/super-type-tokens.html</a>, | |
| * Additional idea (from a suggestion made in comments of the article) | |
| * is to require bogus implementation of <code>Comparable</code> | |
| * (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. | |
| *<p> | |
| * Usage is by sub-classing: here is one way to instantiate reference | |
| * to generic type <code>List<Integer></code>: | |
| *<pre> | |
| * TypeReference ref = new TypeReference<List<Integer>>() { }; | |
| *</pre> | |
| * which can be passed to methods that accept TypeReference, or resolved | |
| * using <code>TypeFactory</code> to obtain {@link ResolvedType}. | |
| */ | |
| public abstract class TypeReference<T> implements Comparable<TypeReference<T>> | |
| { | |
| 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 <code>Comparable</code>) is to prevent constructing a | |
| * reference without type information. | |
| */ | |
| @Override | |
| public int compareTo(TypeReference<T> o) { return 0; } | |
| // just need an implementation, not a good one... hence ^^^ | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment