gpt4 book ai didi

java - 为什么 Java 编译器会提示显式导入名称冲突而不是 import package.*?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:53 25 4
gpt4 key购买 nike

以下代码可以正确编译和运行。

import java.util.*;
import java.io.*;



class Scanner {
public Scanner(InputStream in) {

}
}
public class Foo{
public static void main(String[] args) {
java.util.Scanner in = new java.util.Scanner(System.in);
System.out.println(in.getClass());

Scanner in2 = new Scanner(System.in);
System.out.println(in2.getClass());
}
}

但是,如果我将 import java.util.*; 更改为 import java.util.Scanner;,我将收到以下编译器错误。

Foo.java:1: error: Scanner is already defined in this compilation unit

似乎在这两种情况下,编译器应该能够同样好地消除歧义,那么为什么它只在第二种情况下提示?

最佳答案

这会发生,因为您已经有一个名为 Scanner 的本地类。您需要使用其完全限定名称来调用它:

java.util.Scanner scan = new java.util.Scanner(System.in);

另外,让你的 Scanner 成为一个嵌套的静态类:

public class Foo {

private static class Scanner {

public Scanner(InputStream in) {

}
}

public static void main(String[] args) {
java.util.Scanner in = new java.util.Scanner(System.in);
System.out.println(in.getClass());

Scanner in2 = new Scanner(System.in);
System.out.println(in2.getClass());
}
}

为什么会这样

import 只是告诉编译器在编译时去哪里寻找符号。我不记得我头脑中的那个阶段(预处理/编译),但是包导入并不是那些类成员的显式声明。通过说 import foo.bar.*,您是在说“在编译时在这个包目录中查找符号”,而 import foo.bar.Scanner 是在说“Point Scanner 符号到此"。

简而言之,一个特定的导入很明显,你有一个“扫描仪”的符号,而一个包导入没有指定这个与符号的特定关系。

关于java - 为什么 Java 编译器会提示显式导入名称冲突而不是 import package.*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22678536/

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