min() and max() functions create a new comparator when switching to new aggregation type. That is when they encounter a double and the previous input values were int. The logic checks if the promotion is possible and then switch. By definition, double -> double promotion is always possible (calling canPromote(double, double) will always return true). This will lead to "switching" aggregation type and creating a new comparator with every tuple even though switching here is not necessary since double and double are the same types.