| package org.codehaus.jackson.type; |
| |
| import java.lang.reflect.ParameterizedType; |
| import java.lang.reflect.Type; |
| |
| /** |
| * This class is used to pass full generics type information, and |
| * avoid problems with type erasure (that basically removes most |
| * usable type references from runtime Class objects). |
| * It 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. |
| */ |
| public abstract class TypeReference<T> |
| implements Comparable<TypeReference<T>> |
| { |
| 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 specifc |
| * case when we know an actual use case, and thereby suitable |
| * work arounds 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) { |
| // just need an implementation, not a good one... hence: |
| return 0; |
| } |
| } |
| |