import org.checkerframework.checker.nullness.qual.*;
// Field f needs to be set, b/c the upper bound is @Initialized
//:: error: (initialization.fields.uninitialized)
class Param<T extends @NonNull Object> {
T f;
void foo() {
// Valid, because upper bound is @Initialized @NonNull
f.toString();
}
}
//:: error: (type.argument.type.incompatible)
class Invalid<S extends Param<@Nullable Object>> {
void bar(S s) {
s.foo();
}
//:: error: (type.argument.type.incompatible)
<M extends Param<@Nullable Object>> void foobar(M p) {}
}
interface ParamI<T extends @NonNull Object> {}
class Invalid2<
S extends
Number &
//:: error: (type.argument.type.incompatible)
ParamI<@Nullable Object>> {}
class Invalid3 {
<
M extends
Number &
//:: error: (type.argument.type.incompatible)
ParamI<@Nullable Object>>
void foobar(M p) {}
}