Включает ли звездный импорт подпакеты в Java?

Когда вы объявляете импорт следующим образом:

import com.microsoft.azure.storage.*;

Включает ли это также все в его подпакетах? Например, включает ли это?

import com.microsoft.azure.storage.blob.*

Если нет, то почему? (Редактировать: вопрос «почему» в основном не по теме. Игнорирование этого бита при рассмотрении правильного ответа.)


person Kristian    schedule 23.07.2015    source источник
comment
@madprogrammer хорошо, спасибо, почему?   -  person Kristian    schedule 23.07.2015
comment
@Kristian, потому что это то, что решили сделать разработчики языка?   -  person resueman    schedule 23.07.2015
comment
Потому что так было задумано. Он включает только классы в пакете   -  person MadProgrammer    schedule 23.07.2015
comment
Значит, они в основном стремились к быстрой стратегии загрузки?   -  person Kristian    schedule 23.07.2015
comment
Импорт не влияет на загрузку классов.   -  person Chris Martin    schedule 23.07.2015


Ответы (4)


Нет. Он импортирует только все в пакете (то есть сам каталог). Подкаталоги считаются разными пакетами, поэтому вам необходимо:

import com.microsoft.azure.storage.*
import com.microsoft.azure.storage.blob.*

Можно только догадываться, почему разработчики языка выбрали этот путь, но система, которую они решили использовать, позволяет использовать более детальный подход.

person Robby Cornelissen    schedule 23.07.2015
comment
Нет нужды гадать; это прописано для нас в JLS. - person Makoto; 23.07.2015
comment
@Makoto Обоснование решения изложено в JLS? Хотите поделиться номером абзаца? - person Robby Cornelissen; 23.07.2015
comment
Я неправильно прочитал ваш ответ. Я полагал, что вы искали как, а не почему. Я полагаю, что часть «почему» — это немного глупый вопрос, поскольку у нас нет никакого способа разумно ответить на него. - person Makoto; 23.07.2015
comment
@Makoto Согласен, поэтому я и сказал, что можно только догадываться. - person Robby Cornelissen; 23.07.2015

да, вы можете импортировать все классы из импорта, но это не позволяет импортировать несколько пакетов с одинаковыми именами. Например, импортируйте java.util*; также не импортирует java.util.prefs или .jar, вы должны импортировать их все отдельно. Я не знаю, отвечает ли это на ваш вопрос, и почему я не совсем уверен, что имеет смысл делать это именно так. Если бы вы импортировали аналогичные пакеты с одинаковыми статическими переменными, но вам нужны только два или три пакета, вы бы получили ошибки или код, который не работает должным образом.

person Paul Trueman    schedule 23.07.2015

Для них есть имя — введите импорт по запросу.

Объявление type-import-on-demand позволяет импортировать все доступные типы именованного пакета или типа по мере необходимости.

Они также импортируют только сам пакет, а не какие-либо подпакеты, как показано в примере, выделено мной:

import java.util.*;

заставляет простые имена всех общедоступных типов, объявленных в пакете java.util, быть доступными в объявлениях классов и интерфейсов модуля компиляции. Таким образом, простое имя Vector относится к типу Vector в пакете java.util во всех местах модуля компиляции, где объявление этого типа не затенено (§6.4.1) или скрыто (§6.4.2).

person Makoto    schedule 23.07.2015

включает ли это все в / подкаталоги? включая что-то вроде этого?

* обозначает все единицы компиляции внутри пакета com.microsoft.azure.storage, где подпакеты на самом деле не являются единицами компиляции и поэтому не извлекаются, когда вы пишете myPack.*. Блок компиляции включает class, interface, enum и т. д.

person ΔȺȾΔ    schedule 23.07.2015