docs: private TypeInformation<KEY> validateKeyType(TypeInformation<KEY> keyType) {
  		Stack<TypeInformation<?>> stack = new Stack<>();
  		stack.push(keyType);
  
  		List<TypeInformation<?>> unsupportedTypes = new ArrayList<>();
  
  		while (!stack.isEmpty()) {
  			TypeInformation<?> typeInfo = stack.pop();
  
  			if (!validateKeyTypeIsHashable(typeInfo)) {
  				unsupportedTypes.add(typeInfo);
  			}
  
  			if (typeInfo instanceof TupleTypeInfoBase) {
  				for (int i = 0; i < typeInfo.getArity(); i++) {
  					stack.push(((TupleTypeInfoBase) typeInfo).getTypeAt(i));
  				}
  			}
  		}
  
  		if (!unsupportedTypes.isEmpty()) {
  			throw new InvalidProgramException("Type " + keyType + " cannot be used as key. Contained " +
  					"UNSUPPORTED key types: " + StringUtils.join(unsupportedTypes, ", ") + ". Look " +
  					"at the keyBy() documentation for the conditions a type has to satisfy in order to be " +
  					"eligible for a key.");
  		}
  
  		return keyType;
  	}