Java数组和列表的共同祖先

在.NET中,数组和列表都具有Enumerable作为祖先,因此接受Enumerable作为参数的方法可以接收数组和列表作为其参数。 我想知道Java中是否有类似的东西?

不,Java中没有相应的东西。 我通常建议你设计API方法来接收ListCollectionIterable 。 虽然这些排除了直接使用数组调用方法,但您可以使用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 l = new ArrayList(); // complain Object[] l2 = new String[1]; // ok l2[0] = 4; // throw ArrayStoreException. 

如果我们考虑generics,它会变得更糟,但那是另一个话题。 总而言之,我不知道这个设计的基本原理,但我们需要忍受它。

两者都派生自java.lang.Object 。 但是,这不是与collections相关的,我认为这是你正在寻找的。

IterableIEnumerable的Java等价物。 所有/大多数集合都实现了这个接口(包括ArrayList和数组),所以是的。 但它不是一个“祖先”(它也不是在.NET中),而是一个通用的界面。