| import org.checkerframework.checker.nullness.qual.*; |
| import org.checkerframework.framework.qual.DefaultQualifier; |
| |
| public class WildcardSuper { |
| |
| void testWithSuper(Cell<? super @NonNull String> cell) { |
| // TODO: Address comments. Since ? is explicitly lower bounded, I have made a judgment that |
| // it should be implicitly upper bounded. |
| // This is valid because the default upper bound is NonNull |
| // :: error: (dereference.of.nullable) |
| cell.get().toString(); |
| } |
| |
| // TODO: THIS SHOULD JUST ISSUE A WARNING, WHY WOULD PEOPLE WANT TO WRITE CONTRADICTING BOUNDS? |
| void testWithContradiction(Cell<? super @Nullable String> cell) { |
| // This is actually valid, because it's a contradiction, because |
| // the implicit upper bound is NonNull. |
| // We are free to do anything, as the method is not callable. |
| // TODO: test whether all calls of method fail. |
| // :: error: (dereference.of.nullable) |
| cell.get().toString(); |
| } |
| |
| @DefaultQualifier(Nullable.class) |
| void testWithImplicitNullable(@NonNull Cell<? super @NonNull String> cell) { |
| // :: error: (dereference.of.nullable) |
| cell.get().toString(); |
| } |
| |
| void testWithExplicitNullable(Cell<@Nullable ? extends @Nullable String> cell) { |
| // :: error: (dereference.of.nullable) |
| cell.get().toString(); |
| } |
| |
| void testWithDoubleNullable(Cell<@Nullable ? extends @Nullable String> cell) { |
| // :: error: (dereference.of.nullable) |
| cell.get().toString(); |
| } |
| |
| class Cell<E extends @Nullable Object> { |
| E get() { |
| throw new RuntimeException(); |
| } |
| } |
| } |