Annotation Type CanonicalName


  • @Documented
    @Retention(RUNTIME)
    @Target({TYPE_USE,TYPE_PARAMETER})
    @SubtypeOf({FullyQualifiedName.class,CanonicalNameOrEmpty.class,CanonicalNameOrPrimitiveType.class})
    public @interface CanonicalName
    Canonical names have the same syntactic form as fully-qualified names. Every canonical name is a fully-qualified name, but not every fully-qualified name is a canonical name.

    JLS section 6.7 gives the following example:

    The difference between a fully qualified name and a canonical name can be seen in code such as:
    
     package p;
     class O1 { class I {} }
     class O2 extends O1 {}
     
    Both p.O1.I and p.O2.I are fully qualified names that denote the member class I, but only p.O1.I is its canonical name.
    Given a character sequence that is a fully-qualified name, there is no way to know whether or not it is a canonical name, without examining the program it refers to. Type-checking determines that a string is a CanonicalName based on provenance (what method produced the string), rather than the contents of the string.
    See Also:
    FullyQualifiedName
    See the Checker Framework Manual:
    Signature Checker