1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
import org.checkerframework.common.reflection.qual.MethodVal;
public class MethodValSubtypingTest {
@MethodVal(className = "class", methodName = "method", params = 0) Object classMethod0 = null;
@MethodVal(className = "class", methodName = "method", params = 0) Object classMethod0Dup = null;
@MethodVal(
className = {"class", "class2"},
methodName = {"method", "method2"},
params = {0, 1})
Object classClass2Method0 = null;
@MethodVal(
className = {"class2", "class"},
methodName = {"method", "method2"},
params = {0, 1})
Object class2classMethod0 = null;
Object unknown = null;
void methodValSubtyping() {
classMethod0 = classMethod0Dup;
// :: error: (assignment.type.incompatible)
classMethod0 = classClass2Method0;
// :: error: (assignment.type.incompatible)
classClass2Method0 = class2classMethod0;
classClass2Method0 = classMethod0;
}
void bottomMethodVal() {
classMethod0 = null;
classClass2Method0 = null;
}
void unknownMethodVal1() {
unknown = class2classMethod0;
}
void unknownMethodVal2() {
// :: error: (assignment.type.incompatible)
class2classMethod0 = unknown;
}
@MethodVal(
className = {"aclass", "aclass", "aclass"},
methodName = {"amethod", "amethod", "amethod"},
params = {0, 1, 2})
Object triple = null;
@MethodVal(
className = {"aclass", "aclass", "aclass"},
methodName = {"amethod", "amethod", "amethod"},
params = {2, 1, 0})
Object tripleAgain = null;
@MethodVal(
className = {"aclass"},
methodName = {"amethod"},
params = {2})
Object one = null;
void test() {
tripleAgain = triple;
// :: error: (assignment.type.incompatible)
one = triple;
triple = one;
}
}
|