使用Java5,我们可以编写:Foo[] foos = ...for (Foo foo : foos) 或仅在for循环中使用Iterable。这非常方便。但是,您不能像这样编写可迭代的通用方法:public void bar(Iterable<Foo> foos) { .. }并使用数组调用它,因为它不是Iterable:Foo[] foos = { .. };bar(foos); // compile time error 我想知道这个设计决定背后的原因。
3 回答
慕桂英546537
TA贡献1848条经验 获得超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的较新版本中类似的事情上有任何进展,我很想在评论中知道!:)
添加回答
举报
0/150
提交
取消