docs: @Override
    public void merge(MtasDataCollector<?, ?> newDataCollector,
        Map<MtasDataCollector<?, ?>, MtasDataCollector<?, ?>> map,
        boolean increaseSourceNumber) throws IOException {
      closeNewList();
      if (!collectorType.equals(newDataCollector.getCollectorType())
          || !dataType.equals(newDataCollector.getDataType())
          || !statsType.equals(newDataCollector.getStatsType())
          || !(newDataCollector instanceof MtasDataFull)) {
        throw new IOException("cannot merge different dataCollectors");
      } else {
        segmentRegistration = null;
        @SuppressWarnings("unchecked")
        MtasDataFull<T1, T2> newMtasDataFull = (MtasDataFull<T1, T2>) newDataCollector;
        closeNewList();
        initNewList(newMtasDataFull.getSize());
        if (collectorType.equals(DataCollector.COLLECTOR_TYPE_LIST)) {
          map.put(newDataCollector, this);
          for (int i = 0; i < newMtasDataFull.getSize(); i++) {
            if (newMtasDataFull.fullValueList[i].length > 0) {
              MtasDataCollector<?, ?>[] subCollectors = new MtasDataCollector<?, ?>[1];
              subCollectors[0] = add(newMtasDataFull.keyList[i],
                  increaseSourceNumber);
              setError(newCurrentPosition, newMtasDataFull.errorNumber[i],
                  newMtasDataFull.errorList[i], newCurrentExisting);
              setValue(newCurrentPosition, newMtasDataFull.fullValueList[i],
                  newMtasDataFull.fullValueList[i].length, newCurrentExisting);
              if (hasSub() && newMtasDataFull.hasSub()) {
                // single key implies exactly one subCollector if hasSub
                subCollectors[0].merge(
                    newMtasDataFull.subCollectorListNextLevel[i], map,
                    increaseSourceNumber);
              }
            }
          }
        } else if (collectorType.equals(DataCollector.COLLECTOR_TYPE_DATA)) {
          map.put(newDataCollector, this);
          if (newMtasDataFull.getSize() > 0) {
            MtasDataCollector<?, ?> subCollector = add(increaseSourceNumber);
            setError(newCurrentPosition, newMtasDataFull.errorNumber[0],
                newMtasDataFull.errorList[0], newCurrentExisting);
            setValue(newCurrentPosition, newMtasDataFull.fullValueList[0],
                newMtasDataFull.fullValueList[0].length, newCurrentExisting);
            if (hasSub() && newMtasDataFull.hasSub()) {
              subCollector.merge(newMtasDataFull.subCollectorNextLevel, map,
                  increaseSourceNumber);
            }
          }
        } else {
          throw new IOException("cannot merge " + collectorType);
        }
        closeNewList();
      }
    }