【问题标题】:Why doesn't importing java.util.* include Arrays and Lists?为什么导入 java.util.* 不包括数组和列表?
【发布时间】:2011-05-31 09:47:48
【问题描述】:

我在 debian 5 上使用 java

java版本“1.6.0_20”
Java(TM) SE 运行时环境(内部版本 1.6.0_20-b02)
Java HotSpot(TM) 客户端 VM(内部版本 16.3-b01,混合模式,共享)

为什么和下面有区别

案例一:

import java.util.*;

案例2:

import java.util.*;
import java.util.Arrays;
import java.util.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);
        }

}

注释掉第 2 条和第 3 条导入语句时出现的错误是:

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$

【问题讨论】:

    标签: java import


    【解决方案1】:

    看看这个论坛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>();
    

    您需要指定数组列表的类型,否则编译器会发出警告,因为它无法识别您正在以类型安全的方式使用列表。

    【讨论】:

    • 这并不能真正回答问题,是吗?
    • 不是真的,但这是很好的信息。感谢您的快速回复。
    • 它给出了警告,因为你的行实际上应该是 List i = new ArrayList(...);您需要指定数组列表的类型,否则编译器会发出警告,因为它无法识别您正在以类型安全的方式使用列表。
    【解决方案2】:

    案例 1 应该有效。我看不出有什么不对。可能还有一些其他问题。我会建议一个干净的构建。

    【讨论】:

      【解决方案3】:

      我刚刚编译了它,它编译得很好,没有隐式导入,可能你看到的是过时的缓存或你的 IDE 的东西。

      你试过从命令行编译吗?

      我有完全相同的版本:

      您可能认为警告是一个错误。

      更新

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

      【讨论】:

      • 我看到了警告,但是当我注释掉第二个和第三个导入语句时,我得到一个错误。我已更新帖子以显示实际错误。
      • 这没有意义。你确定你不包括其他一些名为Arrays 的类吗?好的,我想我明白了...更新我的答案。
      • 就是这样。在同一个目录中有一个 Arrays.class。谢谢。
      • @nattyP 我很高兴它有帮助。顺便说一句,您可以将此答案标记为已接受,以便下一个遇到相同问题的人可以快速确定解决方案。
      【解决方案4】:

      两者的区别

      import java.util.*;
      

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

      当代码引用其他一些ListArrays(例如,在同一个包中,或者也通常导入)时变得明显。在第一种情况下,编译器会假设在同一个包中声明的Arrays是要使用的,在后者中,由于它是明确声明的,所以将使用更具体的java.util.Arrays

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 2022-01-25
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多