private static <T> void fillWithConstructor(
     @NonNull final CursorGetter getter,
     final List<T> lists,
     final @NonNull Constructor<T> constructor) {
   try {
     while (getter.moveToNext()) {
       lists.add(constructor.newInstance(getter));
     }
   } catch (final InstantiationException e) {
     throw new IllegalArgumentException(
         "go and make the constructor "
             + constructor.getName()
             + "(CursorWrapper.CursorGetter) accessible",
         e);
   } catch (final IllegalAccessException e) {
     throw new IllegalArgumentException(
         "go and make the constructor "
             + constructor.getName()
             + "(CursorWrapper.CursorGetter) accessible",
         e);
   } catch (final InvocationTargetException e) {
     throw new IllegalArgumentException(
         "go and make the constructor "
             + constructor.getName()
             + "(CursorWrapper.CursorGetter) accessible",
         e);
   }
 }
 private static <T> void fillWithConvertor(
     @NonNull final CursorGetter getter,
     final List<T> list,
     final CursorWrapper.CursorConverter<T> converter) {
   while (getter.moveToNext()) {
     list.add(converter.convert(getter));
   }
 }
 @Override
 public List<T> convert(@NonNull final CursorGetter getter) {
   final List<T> list = new ArrayList<>(getter.getCount());
   if (converter.isLeft()) {
     fillWithConstructor(getter, list, converter.getLeftOrThrow());
   } else if (converter.isRight()) {
     fillWithConvertor(getter, list, converter.getRightOrThrow());
   } else {
     throw new IllegalStateException("Cannot be reached");
   }
   return list;
 }