【问题标题】:Why do wildcard import statements use classpath jar class instead of jdk classes?为什么通配符导入语句使用类路径 jar 类而不是 jdk 类?
【发布时间】:2012-07-17 05:35:10
【问题描述】:

最初我在类路径的 jar 中有一个 java.io.File 类,它没有 separatorChar 属性。所以我遇到了以下代码块运行的问题:

import java.io.File;

public class HelloWorld {

    public static void main(String[] args) { 
        System.out.println("separatorChar= " + File.separatorChar); 
    } 
}

但是我把import语句改成如下:

import java.io.*;

然后我收到一个错误,基本上说明找不到 File.separatorChar。

我认为正在发生的事情是 import java.io.* 正在使用类路径中的 jar 中的类,而 import java.io.File 专门使用 Java 附带的 File 类。

这里的问题是为什么 import java.io.File 有效而 java.io.* 无效?

【问题讨论】:

  • 当前包中必须有另一个名为 File 的类。
  • @EJP,这似乎是问题所在。但是,JVM 搜索类的方式肯定有一些细微差别,因为使用 import java.io.File,使用了正确的类,而 import java.io.*,使用了不同的类。
  • 没错。 Import java.io.* 为编译器提供了另一个位置来查找不在当前包中的类。 Import java.io.File 告诉编译器使用哪个 File。道德:不要重复使用 JDK 类名。

标签: java java-io


【解决方案1】:

在一个空的Project中,代码还是用import java.io.*编译的,看来是用了另一个类。如果你使用 Eclipse,你可以查看File 的工具提示,看看它是哪个类。

或者,您可以使用

System.out.println(File.class.toString())

这将在运行时打印出类。

【讨论】:

  • 有没有办法查看在无头环境中使用了哪个类?
  • 确定有:写入文件。
  • 感谢@felix-freiberger,这验证了我的假设,即肯定存在另一个类。我更新了我的问题,使其更具体并提供更多细节。
【解决方案2】:

正如 EJP 对原始问题的评论,

没错。 Import java.io.* 为编译器提供了另一个位置来查找不在当前包中的类。 Import java.io.File 告诉编译器使用哪个 File。道德:不要重复使用 JDK 类名。

【讨论】:

    【解决方案3】:

    你一定是在什么地方搞砸了。

    当我编译时

    import java.io.*;
    
    public class HelloWorld {
    
        public static void main(String[] args) { 
            System.out.println("separatorChar= " + File.separatorChar); 
        } 
    }
    

    我明白了

    c:\files\j>javac HelloWorld.java
    
    c:\files\j>java HelloWorld
    separatorChar= \
    

    【讨论】:

      【解决方案4】:

      当你使用 java.io.*;你所看到的只是文件,因此到达 separatorChar 的路径不是 File.seperatorChar,而是 io.file.separaterChar。它处理起点在哪里。这就像一个文件系统......如果你在 /users/matt 并且你输入 /documents/mytext.txt 完整路径是 C:/users/matt/documents/mytext.txt 如果我回到用户文件,然后相同的命令 (/documents/mytext.txt) 将查找不存在的 C:/users/documents/mytext.txt。希望对您有所帮助。

      【讨论】:

      • io.File.separatorChar 不起作用。答案完全不正确。
      • 对不起,这并不是一个完整的答案,而是对正在发生的事情的更多解释。你永远不能比你所在的位置低 1 级。
      • 但它没有传达这一点,即使传达了也不是答案。问题完全不同。 * 打开另一个包作用域进行搜索:文件+directs+编译器到特定包作用域中的特定类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2017-01-04
      • 2010-09-13
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多