### Question:
RowParametricType implements ParametricType { @Override public Type createType(TypeManager typeManager, List<TypeParameter> parameters) { checkArgument(!parameters.isEmpty(), "Row type must have at least one parameter"); checkArgument( parameters.stream().allMatch(parameter -> parameter.getKind() == ParameterKind.NAMED_TYPE), "Expected only named types as a parameters, got %s", parameters); List<TypeSignatureParameter> typeSignatureParameters = parameters.stream() .map(TypeParameter::getNamedType) .map(parameter -> TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(parameter.getName(), parameter.getType().getTypeSignature()))) .collect(toList()); List<RowType.Field> fields = parameters.stream() .map(TypeParameter::getNamedType) .map(parameter -> new RowType.Field(parameter.getName().map(RowFieldName::getName), parameter.getType())) .collect(toList()); return RowType.createWithTypeSignature(new TypeSignature(StandardTypes.ROW, typeSignatureParameters), fields); } private  RowParametricType(); @Override String getName(); @Override Type createType(TypeManager typeManager, List<TypeParameter> parameters); static final RowParametricType ROW; }### Answer:
@Test public void testTypeSignatureRoundTrip() { TypeManager typeManager = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); TypeSignature typeSignature = new TypeSignature( ROW, TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName("col1")), BIGINT.getTypeSignature())), TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName("col2")), DOUBLE.getTypeSignature()))); List<TypeParameter> parameters = typeSignature.getParameters().stream() .map(parameter -> TypeParameter.of(parameter, typeManager)) .collect(Collectors.toList()); Type rowType = RowParametricType.ROW.createType(typeManager, parameters); assertEquals(rowType.getTypeSignature(), typeSignature); }