import org.checkerframework.checker.initialization.qual.UnderInitialization; import org.checkerframework.checker.initialization.qual.UnknownInitialization; public class Subtyping { void test1( @UnknownInitialization(Object.class) Object unknownObject, @UnderInitialization(Object.class) Object underObject, @UnknownInitialization(Subtyping.class) Object unknownSubtyping, @UnderInitialization(Subtyping.class) Object underSubtyping) { //::error: (assignment.type.incompatible) underObject = unknownObject; underObject = underSubtyping; //::error: (assignment.type.incompatible) underObject = unknownSubtyping; } void test2( @UnknownInitialization(Object.class) Object unknownObject, @UnderInitialization(Object.class) Object underObject, @UnknownInitialization(Subtyping.class) Object unknownSubtyping, @UnderInitialization(Subtyping.class) Object underSubtyping) { unknownObject = underSubtyping; unknownObject = unknownSubtyping; unknownObject = underObject; } void test3( @UnknownInitialization(Object.class) Object unknownObject, @UnderInitialization(Object.class) Object underObject, @UnknownInitialization(Subtyping.class) Object unknownSubtyping, @UnderInitialization(Subtyping.class) Object underSubtyping) { //::error: (assignment.type.incompatible) underSubtyping = unknownObject; //::error: (assignment.type.incompatible) underSubtyping = unknownSubtyping; //::error: (assignment.type.incompatible) underSubtyping = underObject; } void test4( @UnknownInitialization(Object.class) Object unknownObject, @UnderInitialization(Object.class) Object underObject, @UnknownInitialization(Subtyping.class) Object unknownSubtyping, @UnderInitialization(Subtyping.class) Object underSubtyping) { //::error: (assignment.type.incompatible) unknownSubtyping = unknownObject; unknownSubtyping = underSubtyping; //::error: (assignment.type.incompatible) unknownSubtyping = underObject; } }