import java.util.*; import checkers.nullness.quals.*; // bound errors are errors related to collection not accepting nullable elements public class ToArray { private List<@Nullable String> nullableList = new ArrayList<@Nullable String>(); // bound error private List<@NonNull String> nonnullList = new ArrayList<@NonNull String>(); // bound error void listToArrayObject() { for (@Nullable Object o : nullableList.toArray()); for (@NonNull Object o : nullableList.toArray()); // error for (@Nullable Object o : nonnullList.toArray()); for (@NonNull Object o : nonnullList.toArray()); } void listToArrayE() { for (@Nullable String o : nullableList.toArray(new @Nullable String[0])); for (@NonNull String o : nullableList.toArray(new @Nullable String[0])); // error for (@Nullable String o : nullableList.toArray(new @NonNull String[0])); for (@NonNull String o : nullableList.toArray(new @NonNull String[0])); for (@Nullable String o : nonnullList.toArray(new String[0])); for (@NonNull String o : nonnullList.toArray(new @Nullable String[0])); // error for (@Nullable String o : nonnullList.toArray(new @NonNull String[0])); for (@NonNull String o : nonnullList.toArray(new @NonNull String[0])); } private Collection<@Nullable String> nullableCol = new ArrayList<@Nullable String>(); // bound error private Collection<@NonNull String> nonnullCol = new ArrayList<@NonNull String>(); // bound error void colToArrayObject() { for (@Nullable Object o : nullableCol.toArray()); for (@NonNull Object o : nullableCol.toArray()); // error for (@Nullable Object o : nonnullCol.toArray()); for (@NonNull Object o : nonnullCol.toArray()); } void colToArrayE() { for (@Nullable String o : nullableCol.toArray(new @Nullable String[0])); for (@NonNull String o : nullableCol.toArray(new @Nullable String[0])); // error for (@Nullable String o : nullableCol.toArray(new @NonNull String[0])); for (@NonNull String o : nullableCol.toArray(new @NonNull String[0])); // error for (@Nullable String o : nonnullCol.toArray(new String[0])); for (@NonNull String o : nonnullCol.toArray(new @Nullable String[0])); // error for (@Nullable String o : nonnullCol.toArray(new @NonNull String[0])); for (@NonNull String o : nonnullCol.toArray(new @NonNull String[0])); } void testHearusitics() { for (@Nullable String o : nonnullCol.toArray(new String[] {})); for (@NonNull String o : nonnullCol.toArray(new String[] {})); for (@Nullable String o : nonnullCol.toArray(new String[0])); for (@NonNull String o : nonnullCol.toArray(new String[0])); for (@Nullable String o : nonnullCol.toArray(new String[nonnullCol.size()])); for (@NonNull String o : nonnullCol.toArray(new String[nonnullCol.size()])); for (@Nullable String o : nonnullCol.toArray(new @Nullable String[] {null})); for (@NonNull String o : nonnullCol.toArray(new @Nullable String[] {null})); // error for (@Nullable String o : nonnullCol.toArray(new String[1])); for (@NonNull String o : nonnullCol.toArray(new String[1])); // error for (@Nullable String o : nonnullCol.toArray(new String[nonnullCol.size() + 1])); for (@NonNull String o : nonnullCol.toArray(new String[nonnullCol.size() + 1])); // error // cannot handle the following cases for now for (@Nullable String o : nonnullCol.toArray(new String[nonnullCol.size() - 1])); for (@NonNull String o : nonnullCol.toArray(new String[nonnullCol.size() - 1])); // error } }