Java数组和列表的共同祖先

22

.NET框架中,数组和列表都有Enumerable作为它们的祖先类,因此,一个接收Enumerable作为参数的方法可以接收数组和列表。

我想知道在Java中是否有类似的东西?

6个回答

28

不,Java 中没有相应的等价物。通常建议您设计 API 方法来接收 List<T>Collection<T>Iterable<T>。虽然这样会排除使用数组直接调用该方法的可能性,但您可以很容易地使用 Arrays.asList 将数组包装起来。与将数组作为方法参数指定强制执行单个实现相比,这对调用者更加灵活。

我同意这并不理想。

请注意,在 .NET 中,单维数组不仅实现了 IEnumerable<T> 接口,还实现了 IList<T> 接口。


4

它们没有共同的祖先,不过有方法可以根据需要在两种类型之间进行转换 -

所以你可以提供一个重载的方法来转换为通用类型 - 例如:
public void doAll(MyType[] array) {
    doAll(Arrays.asList(array));
}

public void doAll(List<MyType> list) {
    //... process List here.
}

3

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);

2

基本上,数组具有隐式类型,该类型是对象的子类。请参见JLS中的Arrays

   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<Object> l = new ArrayList<String>(); // complain 
Object[] l2 = new String[1]; // ok

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

如果考虑到泛型,情况会更糟。总的来说,我不知道这种设计的理由是什么,但是我们必须接受它。


1

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


1
这个回答是不正确的。数组没有实现Iterable接口。 - nasch

1

它们都派生自java.lang.Object。然而,这与集合无关,我想这不是你要找的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接