import testlib.util.*;
public abstract class MethodOverrides {
public abstract @Odd String method();
public abstract String methodSub();
public abstract void param(@Odd String s);
public abstract void paramSup(@Odd String s);
public abstract void receiver(@Odd MethodOverrides this);
public abstract void receiverSub(@Odd MethodOverrides this);
public static class SubclassA extends MethodOverrides {
public @Odd String method() {
//:: error: (assignment.type.incompatible)
@Odd String s = "";
return s;
}
public @Odd String methodSub() {
//:: error: (assignment.type.incompatible)
@Odd String s = "";
return s;
}
public void param(@Odd String s) {}
public void paramSup(String s) {}
public void receiver(@Odd SubclassA this) {}
public void receiverSub() {}
}
static class X {
<T> T @Odd [] method(T @Odd [] t) {
return null;
}
}
static class Y extends X {
@Override
<S> S @Odd [] method(S @Odd [] s) {
return null;
}
}
static class Z extends X {
@Override
// return type is an incorrect override, as it's a supertype
//:: error: (override.return.invalid)
<A> A[] method(A[] s) {
return null;
}
}
static class Z2 extends X {
@Override
//:: error: (override.return.invalid) :: error: (override.param.invalid)
<A> @Odd A[] method(@Odd A[] s) {
return null;
}
}
static class ClX<T> {
T @Odd [] method(T @Odd [] t) {
return null;
}
}
static class ClY<S> extends ClX<S> {
@Override
S @Odd [] method(S @Odd [] s) {
return null;
}
}
static class ClZ<S> extends ClX<S> {
@Override
//:: error: (override.return.invalid) :: error: (override.param.invalid)
@Odd S[] method(@Odd S[] s) {
return null;
}
}
// TODO others...
}