code: @Override
  	public Type apply(SemanticType type, LifetimeRelation lifetimes) {
  		switch (type.getOpcode()) {
  		case SEMTYPE_array:
  			return apply((SemanticType.Array) type, lifetimes);
  		case SEMTYPE_reference:
  		case SEMTYPE_staticreference:
  			return apply((SemanticType.Reference) type, lifetimes);
  		case SEMTYPE_record:
  			return apply((SemanticType.Record) type, lifetimes);
  		case SEMTYPE_union:
  			return apply((SemanticType.Union) type, lifetimes);
  		case SEMTYPE_intersection:
  			return apply((SemanticType.Intersection) type, lifetimes);
  		case SEMTYPE_difference:
  			return apply((SemanticType.Difference) type, lifetimes);
  		default:
  			// NOTE: all other cases are already instances of Type
  			return (Type) type;
  		}
  	}
docs: Extract an instance of <code>Type</code> from <code>SemanticType</code> which
  is the best possible approximation.
  
  @param type
  The semantic type being converted into a concrete type.
  @return