blob: 266eee6f1c5a9c6ee9f18c7d881aa6d391737907 [file] [log] [blame]
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);
}