blob: 0fc78e3aef9fdbf6e7fa394dcd5ebfd23ca05d9f [file] [log] [blame]
import org.checkerframework.checker.nullness.qual.*;
public class GenericsBounds5 {
class Collection1<E extends @Nullable Object> {
public void add(E elt) {
// This call is forbidden, because elt might be null.
// :: error: (dereference.of.nullable)
elt.hashCode();
}
}
<@Nullable F extends @Nullable Object> void addNull1(Collection1<F> l) {
// This call is allowed, because F is definitely @Nullable.
l.add(null);
}
// Effectively, this should be the same signature as above.
// TODO: the type "@Nullable ?" is "@Nullable ? extends @NonNull Object",
// with the wrong extends bound.
void addNull2(Collection1<@Nullable ? extends @Nullable Object> l) {
// This call has to pass, like above.
l.add(null);
}
<@Nullable F extends @Nullable Object> void addNull3(Collection1<F> l, F p) {
// This call is allowed, because F is definitely @Nullable.
l.add(null);
l.add(p);
}
// :: error: (assignment)
Collection1<@Nullable ? extends @Nullable Integer> f = new Collection1<@NonNull Integer>();
void bad(Collection1<@NonNull Integer> nnarg) {
// These have to be forbidden, because f1 might refer to a
// collection that has NonNull as type argument.
// :: error: (type.argument)
addNull1(nnarg);
// :: error: (argument)
addNull2(nnarg);
// :: error: (type.argument)
addNull3(nnarg, Integer.valueOf(4));
}
}