gpt4 book ai didi

Java导入通配符不导入包内的所有内容

转载 作者:行者123 更新时间:2023-11-30 08:12:31 26 4
gpt4 key购买 nike

我正在编写一个 Java 程序,它有一个带有 Action 监听器的按钮:

    JButton button = new JButton("Change");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText(textField.getText());
}
});

在文件的顶部,我有这两个导入语句:

import java.awt.*;
import javax.swing.*;

我知道这是糟糕的做法,我正在复习考试,将它写在页面顶部会更容易、更快捷。

但是,我收到一个错误,告诉我导入 java.awt.event.ActionListener

如果 event 包在 java.awt 中并且我使用通配符 * 导入所有内容,那么为什么它没有被导入??

最佳答案

这是 Java Language Specification 中按需导入类型的定义:

A type-import-on-demand declaration allows all accessible types of a named package or type to be imported as needed.

TypeImportOnDemandDeclaration: import PackageOrTypeName . * ;

理解术语很重要:“命名包的所有可访问类型”是指 package 声明特别是 之前的所有类型.*.

所以,如果一个类的包定义如下:

package my.pkg.name;

然后它将可用于import my.pkg.name.*,但是如果类定义如下:

package my.pkg.name.subname;

那么它将无法用于import my.pkg.name.*,因为它不属于那个包。它特别属于 my.pkg.name.subname,就 Java 而言,这是一个不同的包。

确实,Java 实现通常希望包在目录层次结构中排序,因此 my.pkg.name.subname 的目录将位于 的目录下我的.pkg.name。如果你想到它,假设你写了

ls my/pkg/name/*

在该目录中。它的行为非常相似:它只会直接给你这个目录下的文件,而不是它下面的目录。 type-import-on-demand 的语义几乎相同(不包括 subname“目录”本身,因为它不是类型)。

关于Java导入通配符不导入包内的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30424206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com