首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么数组不能赋值给Iterable?

为什么数组不能赋值给Iterable?
EN

Stack Overflow用户
提问于 2009-07-21 15:49:21
回答 3查看 52.1K关注 0票数 192

使用Java5,我们可以这样写:

代码语言:javascript
复制
Foo[] foos = ...
for (Foo foo : foos) 

或者只是在for循环中使用Iterable。这非常方便。

但是,您不能像这样为iterable编写泛型方法:

代码语言:javascript
复制
public void bar(Iterable<Foo> foos) { .. }

并使用数组调用它,因为它不是Iterable:

代码语言:javascript
复制
Foo[] foos = { .. };
bar(foos);  // compile time error 

我想知道这个设计决定背后的原因。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-21 23:18:06

数组可以实现接口(Cloneablejava.io.Serializable)。那么为什么不使用Iterable呢?我猜Iterable会强制添加iterator方法,而数组并不实现方法。char[]甚至不会覆盖toString。无论如何,引用数组应该被认为是不理想的--使用dfa s。作为List注释,Arrays.asList会显式地为你做转换。

(话虽如此,您可以在数组上调用clone。)

票数 77
EN

Stack Overflow用户

发布于 2010-02-02 22:37:41

数组是一个对象,但它的项可能不是。数组可能包含像int这样的基元类型,而Iterable无法处理。至少我是这么想的。

票数 60
EN

Stack Overflow用户

发布于 2020-04-20 04:17:51

编译器实际上将数组上的计数器转换为带有计数器变量的简单for循环。

编译以下代码

代码语言:javascript
复制
public void doArrayForEach() {
    int[] ints = new int[5];

    for(int i : ints) {
        System.out.println(i);
    }
}

然后反编译.class文件会产生如下结果

代码语言:javascript
复制
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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1160081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档