Annotation 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:
See the Checker Framework Manual:
Signature Checker