| import org.checkerframework.checker.nullness.qual.*; |
| |
| class APair<S extends @Nullable Object, T extends @Nullable Object> { |
| static <U extends @Nullable Object, V extends @Nullable Object> APair<U, V> of(U p1, V p2) { |
| return new APair<U, V>(); |
| } |
| |
| static <U extends @Nullable Object, V extends @Nullable Object> APair<U, V> of2(U p1, V p2) { |
| return new APair<>(); |
| } |
| } |
| |
| class PairSub<SS extends @Nullable Object, TS extends @Nullable Object> extends APair<SS, TS> { |
| static <US extends @Nullable Object, VS extends @Nullable Object> PairSub<US, VS> of( |
| US p1, VS p2) { |
| return new PairSub<US, VS>(); |
| } |
| } |
| |
| class PairSubSwitching<SS extends @Nullable Object, TS extends @Nullable Object> |
| extends APair<TS, SS> { |
| static <US extends @Nullable Object, VS extends @Nullable Object> PairSubSwitching<US, VS> ofPSS( |
| US p1, VS p2) { |
| return new PairSubSwitching<US, VS>(); |
| } |
| } |
| |
| class Test1<X extends @Nullable Object> { |
| APair<@Nullable X, @Nullable X> test1(@Nullable X p) { |
| return APair.<@Nullable X, @Nullable X>of(p, (X) null); |
| } |
| } |
| |
| class Test2<X extends @Nullable Object> { |
| APair<@Nullable X, @Nullable X> test1(@Nullable X p) { |
| return APair.of(p, (@Nullable X) null); |
| } |
| /* |
| APair<@Nullable X, @Nullable X> test2(@Nullable X p) { |
| // TODO cast: should this X mean the same as above?? |
| return APair.of(p, (X) null); |
| } |
| */ |
| } |
| |
| class Test3<X extends @Nullable Object> { |
| APair<@NonNull X, @NonNull X> test1(@Nullable X p) { |
| // :: error: (return) |
| return APair.of(p, (X) null); |
| } |
| } |
| |
| class Test4 { |
| APair<@Nullable String, Integer> psi = PairSub.of("Hi", 42); |
| APair<@Nullable String, Integer> psi2 = PairSub.of(null, 42); |
| // :: error: (assignment) |
| APair<String, Integer> psi3 = PairSub.of(null, 42); |
| |
| APair<@Nullable String, Integer> psisw = PairSubSwitching.ofPSS(42, null); |
| // :: error: (assignment) |
| APair<String, Integer> psisw2 = PairSubSwitching.ofPSS(42, null); |
| } |