| // The test cases GenericNull, FieldAccessTest, and InferTypeArgs often fail together. |
| // Here are some things that might be wrong if they are failing. |
| // * If you have overridden AnnotatedTypeFactory.createTreeAnnotator(), the body should return a |
| // list that contains the result of running the overridden implementation, as in: |
| // public TreeAnnotator createTreeAnnotator() { |
| // return new ListTreeAnnotator(super.createTreeAnnotator(), new MyOwnTreeAnnotator(this)); |
| // } |
| // * If 'null' is intentionally not the bottom type in your type hierarchy, then you may suppress |
| // this warning for your particular type system. |
| // |
| // * The standard defaulting rules set the qualifier of type variable lower |
| // bounds to bottom. (https://checkerframework.org/manual/#climb-to-top) If |
| // you change this default to top, then this error will go away. (Add the |
| // meta-annotation @DefaultFor(LOWER_BOUNDS) to the top annotation class.) |
| // This will make types like List<@Bottom Object> illegal, so carefully |
| // consider if this is desirable. |
| // |
| |
| public class GenericNull { |
| /** |
| * In most type systems, null's type is bottom and therefore the generic return type T is a |
| * supertype of null's type. |
| * |
| * <p>However, in the nullness and lock type systems, null's type is not bottom, so they exclude |
| * this test. For the Lock Checker, null's type is bottom for the @GuardedByUnknown hierarchy but |
| * not for the @LockPossiblyHeld hierarchy. |
| */ |
| @SuppressWarnings({"nullness", "lock"}) |
| <T> T f() { |
| return null; |
| } |
| } |