Разница между полное имя и каноническое имя можно
видеть в таком коде, как:
Код: Выделить всё
package p;
class O1 { class I {} }
class O2 extends O1 {}
член класса I, но только p.O1.I является его каноническим именем.
Я не совсем понимаю, почему p.O2.I не является каноническим именем.
Согласно 6.7:
Каждый примитивный тип, именованный пакет, класс верхнего уровня и
интерфейс верхнего уровня имеют каноническое имя:• Для каждого примитивного типа, именованного пакета, класса верхнего уровня и интерфейса верхнего
уровня каноническое имя совпадает с полным
именем.
Каждый класс-член, интерфейс-член и тип массива могут иметь
каноническое имя:
• Класс-член или интерфейс-член M, объявленный в другом класс или
интерфейс C имеет каноническое имя тогда и только тогда, когда C имеет каноническое
имя.
My понимание заключается в том, что p.O2.I является «классом-членом или интерфейсом M, объявленным в другом классе C», класс O2 является классом верхнего уровня, поэтому он имеет каноническое имя p.O2. Тогда согласно правилу,Почему p.O2.I не является каноническим именем?
Кроме того, я тоже не вижу разница между каноническим именем и полным именем (по сравнению с предыдущим цитируемым абзацем):
Каждый класс-член, интерфейс-член и тип массива могут иметь полностью
полное имя:
• Класс-член или интерфейс-член M из другой класс или интерфейс C
имеет полное имя тогда и только тогда, когда C имеет полное
имя.
Может ли кто-нибудь объяснить мне это подробно?
Спасибо, что читаете.
Подробнее здесь: https://stackoverflow.com/questions/789 ... d-canonica