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

使用Java5,我们可以编写:


Foo[] foos = ...

for (Foo foo : foos) 

或仅在for循环中使用Iterable。这非常方便。


但是,您不能像这样编写可迭代的通用方法:


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

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


Foo[] foos = { .. };

bar(foos);  // compile time error 

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


萧十郎
浏览 677回答 3
3回答

幕布斯6054654

该数组是一个对象,但可能不是。该数组可能包含一个像int这样的基本类型,Iterable无法应付。至少我是这样认为的。

慕桂英546537

数组应该支持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的较新版本中类似的事情上有任何进展,我很想在评论中知道!:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java