Java数组和列表的公共祖先

Java数组和列表的公共祖先,java,enumerable,Java,Enumerable,在.NET中,数组和列表都以Enumerable作为祖先,因此接受Enumerable作为参数的方法可以接收数组和列表作为其参数。 我想知道Java中是否有类似的东西?两者都源自Java.lang.Object。但是,这与集合无关,我认为这正是您要寻找的。Java中的数组和列表除了Java.lang.Object之外,没有共享一个共同的祖先 可以使用foreach循环访问这两个对象,如下所示: String [] array = new String [] { "foo", "bar", "ba

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

两者都源自
Java.lang.Object
。但是,这与集合无关,我认为这正是您要寻找的。

Java中的数组和列表除了Java.lang.Object之外,没有共享一个共同的祖先

可以使用foreach循环访问这两个对象,如下所示:

String [] array = new String [] { "foo", "bar", "baz", };
List<String> list = Arrays.asList( "x", "y", "z");

for (String s : array)
    System.out.println(s);

for (String s : list)
    System.out.println(s);
String[]array=新字符串[]{“foo”、“bar”、“baz”、};
List=Arrays.asList(“x”、“y”、“z”);
for(字符串s:数组)
系统输出打印项次;
用于(字符串s:列表)
系统输出打印项次;

不,Java中没有等价物。我通常建议您设计API方法来接收
List
Collection
Iterable
。虽然这些方法不允许直接使用数组调用方法,但是可以使用
Arrays.asList
非常轻松地包装数组。对于调用者来说,这比将数组指定为方法参数更为灵活,这将强制单个实现

我同意这并不理想


请注意,在.NET中,一维数组不仅实现了
IEnumerable
——它们还实现了
IList

它们没有共同的祖先,但是,根据需要,有一些方法可以在这两种类型之间强制转换-

因此,您可以提供一个重载方法来强制转换为公共类型,即

public void doAll(MyType[] array) {
    doAll(Arrays.asList(array));
}

public void doAll(List<MyType> list) {
    //... process List here.
}
public void doAll(MyType[]数组){
doAll(Arrays.asList(array));
}
公共作废doAll(列表){
//…这里是进程列表。
}

基本上,数组有一个隐式类型,它是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();//抱怨
对象[]l2=新字符串[1];//好啊
l2[0]=4;//抛出ArrayStoreException。
如果我们考虑泛型,情况会更糟,但这是另一个话题。总而言之,我不知道这种设计的基本原理,但我们需要接受它。

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

List<Object> l = new ArrayList<String>(); // complain 
Object[] l2 = new String[1]; // ok

l2[0] = 4; // throw ArrayStoreException.