使用Java5,我们可以这样写:
Foo[] foos = ...
for (Foo foo : foos)
或者只是在for循环中使用Iterable。这非常方便。
但是,您不能像这样为iterable编写泛型方法:
public void bar(Iterable<Foo> foos) { .. }
并使用数组调用它,因为它不是Iterable:
Foo[] foos = { .. };
bar(foos); // compile time error
我想知道这个设计决定背后的原因。
发布于 2009-07-21 23:18:06
数组可以实现接口(Cloneable
和java.io.Serializable
)。那么为什么不使用Iterable
呢?我猜Iterable
会强制添加iterator
方法,而数组并不实现方法。char[]
甚至不会覆盖toString
。无论如何,引用数组应该被认为是不理想的--使用dfa s。作为List
注释,Arrays.asList
会显式地为你做转换。
(话虽如此,您可以在数组上调用clone
。)
发布于 2010-02-02 22:37:41
数组是一个对象,但它的项可能不是。数组可能包含像int这样的基元类型,而Iterable无法处理。至少我是这么想的。
发布于 2020-04-20 04:17:51
编译器实际上将数组上的计数器转换为带有计数器变量的简单for
循环。
编译以下代码
public void doArrayForEach() {
int[] ints = new int[5];
for(int i : ints) {
System.out.println(i);
}
}
然后反编译.class文件会产生如下结果
public void doArrayForEach() {
int[] ints = new int[5];
int[] var2 = ints;
int var3 = ints.length;
for(int var4 = 0; var4 < var3; ++var4) {
int i = var2[var4];
System.out.println(i);
}
}
https://stackoverflow.com/questions/1160081
复制相似问题