Java数组和列表的共同祖先
在.NET中,数组和列表都具有Enumerable作为祖先,因此接受Enumerable作为参数的方法可以接收数组和列表作为其参数。 我想知道Java中是否有类似的东西?
不,Java中没有相应的东西。 我通常建议你设计API方法来接收List
, Collection
或Iterable
。 虽然这些排除了直接使用数组调用方法,但您可以使用Arrays.asList
非常容易地包装数组。 对于调用者而言,这比将数组指定为方法参数更加灵活,这会强制执行单个实现。
我同意这并不理想。
请注意,在.NET中,一维数组不仅实现IEnumerable
– 它们也实现了IList
。
它们没有共同的祖先,但是,根据需要,可以在两种类型之间进行转换 –
- List.toArray()
- Arrays.asList()
所以你可以提供一个重载方法来转换为一个普通类型 – 即
public void doAll(MyType[] array) { doAll(Arrays.asList(array)); } public void doAll(List list) { //... process List here. }
Java中的Array和List不共享除java.lang.Object之外的共同祖先。
两者都可以使用foreach循环访问,如下所示:
String [] array = new String [] { "foo", "bar", "baz", }; List list = Arrays.asList( "x", "y", "z"); for (String s : array) System.out.println(s); for (String s : list) System.out.println(s);
基本上,数组具有隐式类型,它是object的子类。 请参阅JLS中的数组 :
public static void main(String[] args) { int[] ia = new int[3]; System.out.println(ia.getClass()); System.out.println(ia.getClass().getSuperclass()); } > class [I > class java.lang.Object
当我们考虑协方差/逆变时,处理数组和列表的方式也不相同。
List
如果我们考虑generics,它会变得更糟,但那是另一个话题。 总而言之,我不知道这个设计的基本原理,但我们需要忍受它。
两者都派生自java.lang.Object
。 但是,这不是与collections相关的,我认为这是你正在寻找的。
Iterable
是IEnumerable
的Java等价物。 所有/大多数集合都实现了这个接口(包括ArrayList
和数组),所以是的。 但它不是一个“祖先”(它也不是在.NET中),而是一个通用的界面。