代码之家  ›  专栏  ›  技术社区  ›  dfa

为什么数组不能分配给iterable?

  •  170
  • dfa  · 技术社区  · 15 年前

    使用Java5,我们可以编写:

    Foo[] foos = ...
    for (Foo foo : foos) 
    

    或者只是在for循环中使用iterable。这很方便。

    但是,您不能这样为ITerable编写通用方法:

    public void bar(Iterable<Foo> foos) { .. }
    

    并使用数组调用它,因为它不是一个iterable:

    Foo[] foos = { .. };
    bar(foos);  // compile time error 
    

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

    4 回复  |  直到 7 年前
        1
  •  67
  •   Gray droiddeveloper    7 年前

    数组可以实现接口( Cloneable java.io.Serializable )那为什么不呢? Iterable ?我猜 可迭代的 强制添加 iterator 方法和数组不实现方法。 char[] 甚至不覆盖 toString . 无论如何,应该认为引用数组的使用不理想 List S.作为DFA的评论, Arrays.asList 将显式为您进行转换。

    (说好了,你可以打电话给 clone 关于数组。

        2
  •  55
  •   Gareth Adamson    15 年前

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

        3
  •  16
  •   Daniel Earwicker    10 年前

    数组应该支持 Iterable 它们只是不支持,原因与.NET数组不支持按位置允许只读随机访问的接口(没有定义为标准接口)相同。基本上,框架中经常有一些令人恼火的小缺口,这不值得任何人花时间来修复。如果我们能以某种最佳的方式自己修复它们,那就没关系了,但通常我们做不到。

    更新: 为了公平起见,我提到.NET数组不支持支持按位置随机访问的接口(另请参见我的注释)。但是在.NET 4.5中,精确的接口已经被定义,并且由数组和 List<T> 班级:

    IReadOnlyList<int> a = new[] {1, 2, 3, 4};
    IReadOnlyList<int> b = new List<int> { 1, 2, 3, 4 };
    

    由于可变列表接口 IList<T> 不继承 IReadOnlyList<T> :

    IList<int> c = new List<int> { 1, 2, 3, 4 };
    IReadOnlyList<int> d = c; // error
    

    也许有一种可能的向后兼容性,使这种变化成为可能。

    如果在Java的新版本中有类似的进展,我会很乐意在评论中知道的!:)

        4
  •  14
  •   dlamblin    7 年前

    不幸的是,数组不是 class 够了。他们不执行 Iterable 接口。

    虽然数组现在是实现可克隆和可序列化的对象,但我相信 数组不是正常意义上的对象 不实现接口。

    之所以可以在每个循环中使用它们,是因为Sun为数组添加了一些语法糖分(这是一种特殊情况)。

    因为数组是用Java 1作为“几乎所有对象”启动的,所以要改变它们就太过激烈了。 真实的 Java中的对象。

    推荐文章