Почему я могу исключить инструкцию import при методах цепочки, но не если я называю их индивидуально?

55
4

Например, в этой простой программе Java:

Если я напишу:

frame.getContentPane().add(button);

Мне нужно import javax.swing.*; и код отлично компилируется.

Однако, если я пишу:

Container cont = frame.getContentPane(); cont.add(button);

Мне нужно import javax.swing.*; и import java.awt.*; потому что не должно быть cannot find symbol ошибку компилятора cannot find symbol.

Разве оба способа написания его технически не совпадают? Зачем нужно меньше или больше импортных заявлений так или иначе?

Когда я вызываю его первым способом, как показано в моем примере, не возвращает ли getContentPane() объект типа Container, хотя я не могу ссылаться на него с помощью ссылочной переменной Container?

спросил(а) 2016-04-08T09:42:00+03:00 4 года, 3 месяца назад
1
Решение
67

Из спецификации языка Java:

Объявление импорта позволяет ссылаться на именованный тип или статический член простым именем (§6.2), состоящим из одного идентификатора.

Без использования соответствующей импортной декларации единственный способ ссылаться на тип, объявленный в другом пакете или статический член другого типа, - использовать полное имя (§6.7).

Поэтому единственная причина, по которой вам нужен import - это то, что вы можете использовать "сокращенное" имя класса. Следующее должно работать без использования import java.awt.*:

java.awt.Container cont = frame.getContentPane();
cont.add(button);

"Цепочка" -version вашего кода неявно использует квалифицированное имя класса, поэтому нет необходимости import -statement.

ответил(а) 2016-04-08T09:52:00+03:00 4 года, 3 месяца назад
55

Причина в том, что import java немного отличается от других языков.

В Java во время выполнения все классы в пути класса присутствуют в JVM.

Операции импорта фактически предоставляются, чтобы помочь компилятору определить, к какому Class вы обращаетесь, в случае, если существует много классов с тем же именем.

Итак, почему они не требуются при связывании методов?

Поскольку компилятор может легко узнать, какой тип возвращается конкретным методом, так что никогда не может быть двусмысленности.

ответил(а) 2016-04-08T09:53:00+03:00 4 года, 3 месяца назад
56

Вы определяете переменную типа java.awt.Container

ответил(а) 2016-04-08T09:44:00+03:00 4 года, 3 месяца назад
39

Когда мы пишем:

frame.getContentPane().add(button);  

getContentPane() возвращает анонимный объект-контейнер во время выполнения, с помощью которого вызывается метод add (button). Если вам удастся проверить класс JFrame, он будет выглядеть примерно так:

import java.awt.Container;
public class JFrame extends SomeClassName {
public Container getContentPane() {
Container cont;
//Some great code which assigns container with its appropriate value.
return cont;
}
}

Когда мы пишем:

Container cont = frame.getContentPane();  
cont.add(button);

Мы создаем известный объект, т.е. называем его самим, для чего компилятор должен знать, в какой пакет принадлежит класс Container.

ответил(а) 2016-04-08T10:26:00+03:00 4 года, 3 месяца назад
39

Поскольку класс Container находится в этом package:java.awt.*, Тогда ваша IDE жалуется, что вы также хотите импортировать эти файлы.

ответил(а) 2016-04-08T09:47:00+03:00 4 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема