docs: public T get(int index) {
  
          final int size = size();
          int normalisedIndex = normaliseIndex(index, size);
          if (normalisedIndex < 0) {
              throw new IndexOutOfBoundsException("Negative index [" + normalisedIndex + "] too large for list size " + size);
          }
  
          // either index >= size or the normalised index is negative
          if (normalisedIndex >= size) {
              // find out the number of gaps to fill with null/the default value
              final int gapCount = normalisedIndex - size;
  
              // fill all gaps
              for (int i = 0; i < gapCount; i++) {
                  final int idx = size();
  
                  // if we lazily create default values, use 'null' as placeholder
                  if (lazyDefaultValues)
                      delegate.add(idx, null);
                  else
                      delegate.add(idx, getDefaultValue(idx));
              }
  
              // add the first/last element being always the default value
              final int idx = normalisedIndex;
              delegate.add(idx, getDefaultValue(idx));
  
              // normalise index again to get positive index
              normalisedIndex = normaliseIndex(index, size());
          }
  
          T item = delegate.get(normalisedIndex);
          if (item == null && lazyDefaultValues) {
              item = getDefaultValue(normalisedIndex);
              delegate.set(normalisedIndex, item);
          }
  
          return item;
      }