为什么导入java.util.*不包括Arrays和Lists?

22

我正在debian 5上使用Java

java版本为"1.6.0_20"
Java(TM) SE Runtime Environment(构建1.6.0_20-b02)
Java HotSpot(TM) Client VM(构建16.3-b01,混合模式,共享)

以下两种情况有何不同?

情况1:

import java.util.*;

情况2:

import java.util.*;
import java.util.Arrays;
import java.util.List;

为什么第一个情况不能覆盖第二个情况?

只有在显式导入Arrays和List时,代码才会编译。

代码:

import java.util.*;
import java.util.Arrays;
import java.util.List;

public class Test {
        public static void main (String[] args) {
                List<Integer> i = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
                List<Integer> j = new ArrayList();
                ListIterator<Integer> n = i.listIterator(i.size());

                while(n.hasPrevious()) {
                        j.add(n.previous());
                }

                println(j);

        }

        static void println(Object o) {
                System.out.println(o);
        }

        static void print(Object o) {
                System.out.print(o);
        }

}

当我注释掉第二个和第三个导入语句时,我得到的错误是:

nattyp@debian:~/dev/java$ javac Test.java
Test.java:7: cannot find symbol
symbol  : method asList(int,int,int,int,int,int,int,int,int,int)
location: class Arrays
                List<Integer> i = new ArrayList(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
                                                      ^
Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
nattyp@debian:~/dev/java$
4个回答

9

我刚编译了它,没有隐式导入也可以正常编译,可能你看到的是旧缓存或者IDE的其他问题。

你尝试过从命令行编译吗?

我有完全相同的版本:

here it is

也许你认为这个警告是一个错误。

更新

看起来你的目录中有一个Arrays.class文件(可能是之前创建的)。这就是为什么显式导入可以解决问题的原因。尝试将源代码复制到一个新的干净目录中并再次尝试。这次你会看到没有错误。或者清理你的工作目录并删除Arrays.class文件。


我看到了警告,但是当我注释掉第二和第三个导入语句时,会出现错误。我已经更新了帖子以显示实际的错误。 - nattyP
这没有意义。你确定你没有包含另一个名为“Arrays”的类吗?好的,我想我明白了...更新我的答案。 - OscarRyz
就是这样了。同一目录下有一个Arrays.class文件。谢谢。 - nattyP
@nattyP,我很高兴它能帮到你。顺便说一句,你可以将这个答案标记为已接受,这样下一个遇到同样问题的人就可以快速找到解决方案了。 - OscarRyz

6

以下是“区别”和“差异”的解释:

import java.util.*;

并且

import java.util.*;
import java.util.List;
import java.util.Arrays;

当代码引用其他ListArrays时,这一点变得明显(例如,在同一包中或通常也导入)。在第一种情况下,编译器将假定同一包中声明的Arrays是要使用的数组,在后一种情况下,由于它被特别声明,更具体的java.util.Arrays将被使用。


1
案例1应该是可以工作的。我没有看到任何问题。可能还有其他问题。我建议进行一次清理构建。

0

看看这个论坛http://htmlcoderhelper.com/why-is-using-a-wild-card-with-a-java-import-statement-bad/。讨论了如何使用通配符可能会导致冲突,如果您将新类添加到包中,并且如果有两个具有相同名称的类在不同的包中,那么只会导入其中一个。

更新


它发出警告,因为您的行实际上应该是

List<Integer> i = new ArrayList<Integer>(Arrays.asList(0,1,2,3,4,5,6,7,8,9,10));
List<Integer> j = new ArrayList<Integer>();

你需要为数组列表指定类型,否则编译器会发出警告,因为它无法确定你是否以类型安全的方式使用了该列表。


2
那并没有真正回答问题,是吗? - Nikita Rybak
不是很确切,但这是有用的信息。感谢您的快速回复。 - nattyP
它会发出警告,因为你的代码行实际上应该是List<Integer> i = new ArrayList<Integer>(...);你需要为ArrayList指定类型,否则编译器会发出警告,因为它无法确定你是否以类型安全的方式使用了列表。 - MBU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接