JLS: Chapter 7. Packages:Порядок автоматически импортируемых пакетов и неоднозначность
Пакет состоит из нескольких единиц компиляции (§7.3). Модуль компиляции автоматически получает доступ ко всем типам, объявленным в его пакете, а также автоматически импортирует все общедоступные типы, объявленные в предопределенном пакете java.lang.
Давайте предположим, что следующий код:
package com.example.p1;
public class MyClass { }
package com.example;
public class MyClass { }
package com.example;
public class String { }
package com.example;
import com.example.p1.*;
public class MainNameClash {
private String s; // No Error, even though ambiguous with java.lang.String!
private MyClass m; // No error, even though ambiguous with com.example.p1.MyClass!
}
Если я перееду MyClass
из com.example
в com.example.p2
и импортируйте его с import com.example.p2.*
, я получаю Error: the type MyClass is ambigious
в том месте, где оно используется.
Похоже, что типы из самого пакета всегда имеют приоритет над любыми другими импортируемыми типами, будь то автоматически с java.lang
или явно им с подстановочным импортом и что компилятор не выдаёт никаких предупреждений или ошибок.
Вопрос:
- Почему Java компилятор не генерировать ошибку неоднозначности в этом случае?
- Где в JLS это поведение определено?