Prefer non-varargs methods in overload resolution when tiebreaker #24669
+19 −1
Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull request is closed. Suggestions cannot be applied while viewing a subset of changes. Only one suggestion per line can be applied in a batch. Add this suggestion to a batch that can be applied as a single commit. Applying suggestions on deleted lines is not supported. You must change the existing code in this line in order to create a valid suggestion. Outdated suggestions cannot be applied. This suggestion has been applied or marked resolved. Suggestions cannot be applied from pending reviews. Suggestions cannot be applied on multi-line comments. Suggestions cannot be applied while the pull request is queued to merge. Suggestion cannot be applied right now. Please check back later.
Fixes #24072
Add a tiebreaker in the
comparemethod to prefer non-varargs methods over varargs methods when both alternatives are equally specific.isAsGoodfunction normally prefer varargs methods. However, it can fail to distinguish methods when wildcard types are involved with invariant type parameters. For example:Here,
compare(m1, m2)returns 0 (ambiguous) because bothwinsType1andwinsType2are false:m2is not as good asm1(this is correct: a varargs method can only be as good as another varargs method).m1is NOT as good as them2because Class[? <: T] is not a subtype of Class[T] (Class is invariant)The new tiebreaker resolves this ambiguities by preferring non-varargs methods as a final comparison step when owner hierarchy and type-based comparisons don't distinguish the alternatives.