code: static public List<ICacheKeyGenerator> combine(List<ICacheKeyGenerator> a, List<ICacheKeyGenerator> b) {
  		if (a == null) {
  			return b;
  		} else if (b == null) {
  			return a;
  		}
  		if (a.size() != b.size()) {
  			throw new IllegalStateException();
  		}
  		ICacheKeyGenerator[] combined = new ICacheKeyGenerator[a.size()];
  		boolean modified = false;
  		for (int i = 0; i < a.size(); i++) {
  			combined[i] = a.get(i).combine(b.get(i));
  			modified = modified || combined[i] != a.get(i);
  		}
  		return modified ? Arrays.asList(combined) : a;
  	}
docs: Returns a new list containing the results of combining each element in a with the
  corresponding element in b.  If the result contains the same elements as a, then
  a is returned.
  <p>
  The input arrays must be the same length, and the types of the array elements at each
  index must be the same
  
  @param a
  @param b
  @return The list of combined cache key generators