code: @Override
      protected List<T[]> mate(T[] parent1,
                               T[] parent2,
                               int numberOfCrossoverPoints,
                               Random rng)
      {
          if (parent1.length != parent2.length)
          {
              throw new IllegalArgumentException("Cannot perform cross-over with different length parents.");
          }
          // Create the most specific-type arrays possible.
          @SuppressWarnings("unchecked")
          T[] offspring1 = (T[]) Array.newInstance(parent1.getClass().getComponentType(), parent1.length);
          System.arraycopy(parent1, 0, offspring1, 0, parent1.length);
          @SuppressWarnings("unchecked")
          T[] offspring2 = (T[]) Array.newInstance(parent2.getClass().getComponentType(), parent2.length);
          System.arraycopy(parent2, 0, offspring2, 0, parent2.length);
          // Apply as many cross-overs as required.
          Object[] temp = new Object[parent1.length];
          for (int i = 0; i < numberOfCrossoverPoints; i++)
          {
              // Cross-over index is always greater than zero and less than
              // the length of the parent so that we always pick a point that
              // will result in a meaningful cross-over.
              int crossoverIndex = (1 + rng.nextInt(parent1.length - 1));
              System.arraycopy(offspring1, 0, temp, 0, crossoverIndex);
              System.arraycopy(offspring2, 0, offspring1, 0, crossoverIndex);
              System.arraycopy(temp, 0, offspring2, 0, crossoverIndex);
          }
          List<T[]> result = new ArrayList<T[]>(2);
          result.add(offspring1);
          result.add(offspring2);
          return result;
      }
docs: {@inheritDoc}