Язык Java позволяет идентификаторам классов быть скрытыми идентификаторами пакетов. В вашем случае класс com.xx.a
скрыт пакетом com.xx.a
.
Из Спецификации языка Java :
6.3.2 Скрытые декларации
Простое имя может встречаться в контекстах, где оно может потенциально интерпретироваться как имя переменной, типа или пакета . В этих ситуациях правила §6.5 указывают, что переменная будет выбрана в предпочтении к типу, и что тип будет выбран в предпочтении к пакету. Таким образом, иногда невозможно сослаться на видимый тип или объявление пакета через его простое имя. Мы говорим, что такая декларация скрыта.
Я должен сказать, что правила в п. 6.5 для классификации значения идентификатора далеко не ясны.
Причина, по которой у вас все еще есть копия библиотеки, которая нарушает это правило, заключается в том, что правило не применяется к файлам классов / JAR-файлам и JVM.
Это означает, что вы можете иметь такие конфликты именования в файлах JAR, но вы никогда не увидите его как вывод javac
. Инструментом, который создал эти имена классов / пакетов, скорее всего, является кодовый обфускатор , который создает этот вид грязного кода для сжатия размера файлов и обфускации кода для предотвращения обратного инжиниринга.
PS. При ближайшем рассмотрении это может быть ошибка на стороне Eclipse (при условии, что вы говорите об IDE). Позволяя пустому имени пакета вступать в противоречие с именем класса, Eclipse захлебывается тем, что принимает javac. Трудно следовать спецификации, но из того, что я вижу, javac следует спецификации в этом случае.