// Test case for issue #611: https://github.com/typetools/checker-framework/issues/611
// @skip-test Disabled until the issue is fixed.
import org.checkerframework.checker.nullness.qual.*;
public class RefineOverride {
void m(Sub<@Nullable String> snb, Sub<@NonNull String> snn) {
snb.m7(null);
snn.m7(null);
}
class Super<T> {
void m1(@NonNull String s) {}
void m2(@NonNull String s) {}
void m5(@NonNull String s) {}
void m6(@Nullable String s) {}
void m7(T s) {}
void m11(@NonNull String s1, @NonNull String s2) {}
void m12(@NonNull String s1, @Nullable String s2) {}
void m13(@Nullable String s1, @NonNull String s2) {}
void m14(@Nullable String s1, @Nullable String s2) {}
void m15(T s1, T s2) {}
void m16(@NonNull T s1, @NonNull T s2) {}
void m17(@NonNull T s1, @Nullable T s2) {}
void m18(@Nullable T s1, @NonNull T s2) {}
void m19(@Nullable T s1, @Nullable T s2) {}
void m21(@Nullable String[] a) {}
void m22(@NonNull String[] a) {}
void m23(@Nullable String[] a) {}
void m24(@NonNull String[] a) {}
void m25(T[] a) {}
void m26(@Nullable T[] a) {}
void m27(@NonNull T[] a) {}
void m28(@Nullable T[] a) {}
void m29(@NonNull T[] a) {}
}
class Sub<T> extends Super<T> {
@Override
void m1(@Nullable String s) {}
@Override
void m2(@PolyNull String s) {}
// In the following declarations, all previously-valid invocations remain
// valid, so the compiler should permit the overriding.
// Case 1. A single parameter type is changed from anything to @PolyNull
// in an overriding method.
@Override
void m5(@PolyNull String s) {}
// TODO: should be legal
@Override
void m6(@PolyNull String s) {}
// TODO: should be legal
@Override
void m7(@PolyNull T s) {}
// Case 2. Multiple parameter types are changed to @PolyNull in an
// overriding method.
// (The types for m14 might be better written as "@PolyNull(1)
// ... @PolyNull(2)", but all invocations remain valid.
@Override
void m11(@PolyNull String s1, @PolyNull String s2) {}
// TODO: should be legal
@Override
void m12(@PolyNull String s1, @PolyNull String s2) {}
// TODO: should be legal
@Override
void m13(@PolyNull String s1, @PolyNull String s2) {}
// TODO: should be legal
@Override
void m14(@PolyNull String s1, @PolyNull String s2) {}
// TODO: should be legal
@Override
void m15(@PolyNull T s1, @PolyNull T s2) {}
@Override
void m16(@PolyNull T s1, @PolyNull T s2) {}
// TODO: should be legal
@Override
void m17(@PolyNull T s1, @PolyNull T s2) {}
// TODO: should be legal
@Override
void m18(@PolyNull T s1, @PolyNull T s2) {}
// TODO: should be legal
@Override
void m19(@PolyNull T s1, @PolyNull T s2) {}
// Case 3. Expand the element type of an array.
// The new permissible types are not supertypes of the old types,
// but they still expand the set of permitted invocations.
//:: error: (override.param.invalid)
@Override
void m21(@NonNull String[] a) {}
//:: error: Changing incompatibly to forbid old invocations is not permitted.
@Override
void m22(@Nullable String[] a) {}
// TODO: should be legal
@Override
void m23(@PolyNull String[] a) {}
@Override
void m24(@PolyNull String[] a) {}
@Override
void m25(@PolyNull T[] a) {}
//:: error: (override.param.invalid)
@Override
void m26(@NonNull T[] a) {}
//:: error: Changing incompatibly to forbid old invocations is not permitted.
@Override
void m27(@Nullable T[] a) {}
// TODO: should be legal
@Override
void m28(@PolyNull T[] a) {}
@Override
void m29(@PolyNull T[] a) {}
}
class Super2<T> {
void t1(String s) {}
void t2(String s) {}
void t3(@Nullable String s) {}
void t4(String s) {}
void t5(String[] s) {}
void t6(T s) {}
void t7(T s) {}
void t8(T[] s) {}
void t9(T[] s) {}
}
class Sub2<T> extends Super2<T> {
@Override
void t1(String s) {}
@Override
void t2(@Nullable String s) {}
//:: error: (override.param.invalid)
@Override
void t3(String s) {}
@Override
void t4(@PolyNull String s) {}
@Override
void t5(@PolyNull String[] s) {}
@Override
void t6(@Nullable T s) {}
// TODO: should be legal
@Override
void t7(@PolyNull T s) {}
@Override
void t8(@Nullable T[] s) {}
// TODO: should be legal
@Override
void t9(@PolyNull T[] s) {}
}
}