Java数组和列表的共同祖先

时间:2010-03-14 13:45:45

标签: java enumerable

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

6 个答案:

答案 0 :(得分:21)

不,Java中没有相应的东西。我通常建议您设计API方法以接收List<T>Collection<T>Iterable<T>。虽然这些阻止直接使用数组调用方法,但您可以使用Arrays.asList非常轻松地包装数组。对于调用者来说,这比将数组指定为方法参数更加灵活,这会强制执行单个实现。

我同意这不太理想。

请注意,在.NET中,一维数组不仅实现IEnumerable<T> - 它们也实现IList<T>

答案 1 :(得分:4)

他们没有共同的祖先,但是,有两种方法可以根据需要进行投射 -

所以你可以提供一个重载方法来转换为一个普通类型 - 即

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

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

答案 2 :(得分:3)

Java中的Array和List不共享除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);

答案 3 :(得分:2)

基本上,数组有一个隐式类型,它是object的子类。请参阅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

当我们考虑covariance/contravariance时,处理数组和列表的方式也不尽相同。

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

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

两者都来自java.lang.Object。但是,这不是与收集相关的,我认为这正是您所寻找的。