presto-main/src/main/java/io/prestosql/operator/ParametricImplementationsGroup.java/ParametricImplementationsGroup/ParametricImplementationsGroup
class ParametricImplementationsGroup:    public ParametricImplementationsGroup(
            Map<Signature, T> exactImplementations,
            List<T> specializedImplementations,
            List<T> genericImplementations,
            Signature signature)
    {
        this.exactImplementations = ImmutableMap.copyOf(requireNonNull(exactImplementations, "exactImplementation cannot be null"));
        this.specializedImplementations = ImmutableList.copyOf(requireNonNull(specializedImplementations, "specializedImplementations cannot be null"));
        this.genericImplementations = ImmutableList.copyOf(requireNonNull(genericImplementations, "genericImplementations cannot be null"));
        this.signature = requireNonNull(signature, "signature cannot be null");

        List<T> allImplementations = ImmutableList.<T>builder()
                .addAll(exactImplementations.values())
                .addAll(specializedImplementations)
                .addAll(genericImplementations)
                .build();
        checkArgument(!allImplementations.isEmpty(), "No implementations provided");
        this.nullable = allImplementations.get(0).isNullable();
        this.argumentDefinitions = allImplementations.get(0).getArgumentDefinitions();

        checkArgument(allImplementations.stream().allMatch(choice -> choice.isNullable() == nullable), "all implementations must have the same nullable flag: %s", signature);
        checkArgument(
                allImplementations.stream()
                        .map(T::getArgumentDefinitions)
                        .allMatch(argumentDefinitions::equals),
                "all implementations must have the argument definitions: %s", signature);
    }