我在debian 5上使用java
java版“1.6.0_20”
Java(TM)SE运行时环境(版本1.6.0_20-b02)
Java HotSpot(TM)客户端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$
答案 0 :(得分:7)
我刚编译它并且它编译得很好而没有隐式导入,可能你看到过时的缓存或IDE的某些东西。
您是否尝试过从命令行编译?
我的版本完全相同:
可能你认为警告是错误的。
<强>更新强>
看起来你正在尝试编译的目录中有一个Arrays.class
文件(可能之前创建过)。这就是显式导入解决问题的原因。尝试将源代码复制到干净的新目录,然后重试。你会看到这次没有错误。或者,清理工作目录并删除Arrays.class
答案 1 :(得分:6)
之间的区别
import java.util.*;
和
import java.util.*;
import java.util.List;
import java.util.Arrays;
当代码引用其他List
或Arrays
时(例如,在同一个包中,或者通常也导入),变得明显。在第一种情况下,编译器将假定在同一个包中声明的Arrays
是要使用的那个,在后者中,因为它是专门声明的,所以将使用更具体的java.util.Arrays
。 / p>
答案 2 :(得分:1)
案例1应该有效。我没有看到任何错误。可能还有其他一些问题。我会建议一个干净的构建。
答案 3 :(得分: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>();
您需要指定数组列表的类型,否则编译器会发出警告,因为它无法识别您是否以类型安全的方式使用列表。