docs: public static <T> List<T> getAt(ListWithDefault<T> self, Range range) {
          RangeInfo info = subListBorders(self.size(), range);
  
          // if a positive index is accessed not initialized so far
          // initialization up to that index takes place
          if (self.size() < info.to) {
              self.get(info.to - 1);
          }
  
          List<T> answer = self.subList(info.from, info.to);
          if (info.reverse) {
              answer =  ListWithDefault.newInstance(reverse(answer), self.isLazyDefaultValues(), self.getInitClosure());
          } else {
              // instead of using the SubList backed by the parent list, a new ArrayList instance is used
              answer =  ListWithDefault.newInstance(new ArrayList<T>(answer), self.isLazyDefaultValues(), self.getInitClosure());
          }
  
          return answer;
      }