/sitebricks-converter/src/main/java/com/google/sitebricks/conversion/generics/TypeToken.java

http://github.com/dhanji/sitebricks · Java · 97 lines · 58 code · 12 blank · 27 comment · 4 complexity · 43bab13e5482bb9d11105528c8ebb89a MD5 · raw file

  1. /*
  2. * Copied from Gentyref project http://code.google.com/p/gentyref/
  3. * Reformatted and moved to fit package structure
  4. */
  5. package com.google.sitebricks.conversion.generics;
  6. import java.lang.reflect.ParameterizedType;
  7. import java.lang.reflect.Type;
  8. /**
  9. * Wrapper around {@link Type}.
  10. *
  11. * You can use this to create instances of Type for a type known at compile
  12. * time.
  13. *
  14. * For example, to get the Type that represents List<String>:
  15. * <code>Type listOfString = new TypeToken&lt;List&lt;String&gt;&gt;(){}.getType();</code>
  16. *
  17. * @author Wouter Coekaerts <wouter@coekaerts.be>
  18. *
  19. * @param <T>
  20. * The type represented by this TypeToken.
  21. */
  22. public abstract class TypeToken<T>
  23. {
  24. private final Type type;
  25. /**
  26. * Constructs a type token.
  27. */
  28. protected TypeToken()
  29. {
  30. this.type = extractType();
  31. }
  32. private TypeToken(Type type)
  33. {
  34. this.type = type;
  35. }
  36. public Type getType()
  37. {
  38. return type;
  39. }
  40. private Type extractType()
  41. {
  42. Type t = getClass().getGenericSuperclass();
  43. if (!(t instanceof ParameterizedType))
  44. {
  45. throw new RuntimeException("Invalid TypeToken; must specify type parameters");
  46. }
  47. ParameterizedType pt = (ParameterizedType) t;
  48. if (pt.getRawType() != TypeToken.class)
  49. {
  50. throw new RuntimeException("Invalid TypeToken; must directly extend TypeToken");
  51. }
  52. return pt.getActualTypeArguments()[0];
  53. }
  54. /**
  55. * Gets type token for the given {@code Class} instance.
  56. */
  57. public static <T> TypeToken<T> get(Class<T> type)
  58. {
  59. return new SimpleTypeToken<T>(type);
  60. }
  61. /**
  62. * Gets type token for the given {@code Type} instance.
  63. */
  64. public static TypeToken<?> get(Type type)
  65. {
  66. return new SimpleTypeToken<Object>(type);
  67. }
  68. private static class SimpleTypeToken<T> extends TypeToken<T>
  69. {
  70. public SimpleTypeToken(Type type)
  71. {
  72. super(type);
  73. }
  74. }
  75. @Override
  76. public boolean equals(Object obj)
  77. {
  78. return (obj instanceof TypeToken<?>) && type.equals(((TypeToken<?>) obj).type);
  79. }
  80. @Override
  81. public int hashCode()
  82. {
  83. return type.hashCode();
  84. }
  85. }