code: public static <G extends Gene<?, G>, C extends Comparable<? super C>>
  	Phenotype<G, C> of(
  		final Genotype<G> genotype,
  		final long generation,
  		final Function<? super Genotype<G>, C> function
  	) {
  		return Phenotype.<G, C>of(
  			genotype,
  			generation,
  			function,
  			function instanceof Serializable
  				? (Function<? super C, ? extends C> & Serializable)a -> a
  				: a -> a
  		);
  	}
docs: The {@code Genotype} is copied to guarantee an immutable class. Only
  the age of the {@code Phenotype} can be incremented.
  
  @param <G> the gene type of the chromosome
  @param <C> the fitness value type
  @param genotype the genotype of this phenotype.
  @param generation the current generation of the generated phenotype.
  @param function the fitness function of this phenotype.
  @return a new phenotype from the given parameters
  @throws NullPointerException if one of the arguments is {@code null}.
  @throws IllegalArgumentException if the given {@code generation} is
  {@code < 0}.