Follow-up to #1025. If the varargs argument is in unannotated code and restrictive annotations are disabled, callers from marked code should be able to pass @Nullable either for individual varargs arguments or a @Nullable varargs array.
With restrictive annotations enabled, hopefully this table should cover the behaviors when we see explicit @NonNull annotations (legacy mode behavior to be confirmed):
Annotation Type
Annotation Position
Mode
@NonNull varargs array
@NonNull individual args
declaration
-
standard
❌
✅
declaration
-
legacy
✅
✅
declaration
-
JSpecify
❌
✅
type use
before ...
standard
✅
❌
type use
before ...
legacy
✅
✅
type use
before ...
JSpecify
✅
❌
type use
elements
standard
❌
✅
type use
elements
legacy
✅
✅
type use
elements
JSpecify
❌
✅
type use
both
standard
✅
✅
type use
both
legacy
✅
✅
type use
both
JSpecify
✅
✅
both
before ...
standard
✅
❌
both
before ...
legacy
✅
✅
both
before ...
JSpecify
✅
❌
both
elements
standard
❌
✅
both
elements
legacy
✅
✅
both
elements
JSpecify
❌
✅
both
both
standard
✅
✅
both
both
legacy
✅
✅
both
both
JSpecify
✅
✅
Note that restrictive annotations are read from @NullUnmarked code by default, so calls into @NullUnmarked code should behave as per the table even if the restrictive annotations flag is not passed.
Follow-up to #1025. If the varargs argument is in unannotated code and restrictive annotations are disabled, callers from marked code should be able to pass
@Nullable
either for individual varargs arguments or a@Nullable
varargs array.With restrictive annotations enabled, hopefully this table should cover the behaviors when we see explicit
@NonNull
annotations (legacy mode behavior to be confirmed):@NonNull
varargs array@NonNull
individual args...
...
...
...
...
...
Note that restrictive annotations are read from
@NullUnmarked
code by default, so calls into@NullUnmarked
code should behave as per the table even if the restrictive annotations flag is not passed.