public static class ListListString extends ListListT<String> {
   static final Type expect =
       ParameterizedTypeImpl.make(
           List.class,
           new Type[] {ParameterizedTypeImpl.make(List.class, new Type[] {String.class}, null)},
           null);
 }
 public static class ListListT<T> extends Super<List<List<T>>> {
   static final Type expect =
       ParameterizedTypeImpl.make(
           List.class,
           new Type[] {
             ParameterizedTypeImpl.make(
                 List.class, new Type[] {new ClassTypeVariable("T", ListListT.class)}, null)
           },
           null);
 }
  public static class ListIntSub extends ListInt {
    static final Type expect =
        ParameterizedTypeImpl.make(List.class, new Type[] {Integer.class}, null);

    public List<Integer> getThing() {
      return null;
    }
  }
 private Class<?> getResponseType0(Method method) {
   if (method.isAnnotationPresent(ResponseBody.class)) {
     return method.getReturnType();
   } else {
     if (method.getReturnType() == ResponseEntity.class) {
       Type methodGenericReturnType = method.getGenericReturnType();
       if (methodGenericReturnType instanceof ParameterizedTypeImpl) {
         ParameterizedTypeImpl parameterizedType = (ParameterizedTypeImpl) methodGenericReturnType;
         Type type = parameterizedType.getActualTypeArguments()[0];
         return typeToClass(type);
       } else {
         // TODO Message to the log: recommendation to use ResponseEntity with generic parameter
         return byte[].class;
       }
     }
     return Void.class;
   }
 }
 public static class WildcardT<T> extends Super<List<? extends T>> {
   static final Type expect =
       ParameterizedTypeImpl.make(
           List.class,
           new Type[] {
             new WildcardTypeImpl(new Type[] {new ClassTypeVariable("T", WildcardT.class)}, null)
           },
           null);
 }
  public static class ListUSub<V> extends ListU<V> {
    static final Type expect =
        ParameterizedTypeImpl.make(
            List.class, new Type[] {new ClassTypeVariable("V", ListUSub.class)}, null);

    public List<V> getThing() {
      return null;
    }
  }
  public static class SuperMap<K, V> {
    static final Type expect =
        ParameterizedTypeImpl.make(
            Map.class,
            new Type[] {
              new ClassTypeVariable("K", SuperMap.class), new ClassTypeVariable("V", SuperMap.class)
            },
            null);

    public Map<K, V> getThing() {
      return null;
    }
  }
 public static class SubMap extends SuperMap<String, Integer> {
   static final Type expect =
       ParameterizedTypeImpl.make(Map.class, new Type[] {String.class, Integer.class}, null);
 }
 public static class WildcardTSuperSub extends WildcardTSuper<Integer> {
   static final Type expect =
       ParameterizedTypeImpl.make(
           List.class, new Type[] {new WildcardTypeImpl(null, new Type[] {Integer.class})}, null);
 }
 public static class Wildcard extends Super<List<?>> {
   static final Type expect =
       ParameterizedTypeImpl.make(List.class, new Type[] {new WildcardTypeImpl(null, null)}, null);
 }
 public static class GenericArray extends Super<List<String>[]> {
   static final Type expect =
       GenericArrayTypeImpl.make(
           ParameterizedTypeImpl.make(List.class, new Type[] {String.class}, null));
 }
 public static class ListUSubInt extends ListUSub<Integer> {
   static final Type expect =
       ParameterizedTypeImpl.make(List.class, new Type[] {Integer.class}, null);
 }
 public static class ListU<U> extends Super<List<U>> {
   static final Type expect =
       ParameterizedTypeImpl.make(
           List.class, new Type[] {new ClassTypeVariable("U", ListU.class)}, null);
 }