为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

萧十郎 2019-11-30 12:47:58
使用Java5,我们可以编写:Foo[] foos = ...for (Foo foo : foos) 或仅在for循环中使用Iterable。这非常方便。但是,您不能像这样编写可迭代的通用方法:public void bar(Iterable<Foo> foos) { .. }并使用数组调用它,因为它不是Iterable:Foo[] foos = { .. };bar(foos);  // compile time error 我想知道这个设计决定背后的原因。
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-11-30
?
慕桂英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的较新版本中类似的事情上有任何进展,我很想在评论中知道!:)


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 676 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信