.NET框架中,数组和列表都有Enumerable作为它们的祖先类,因此,一个接收Enumerable作为参数的方法可以接收数组和列表。
我想知道在Java中是否有类似的东西?
.NET框架中,数组和列表都有Enumerable作为它们的祖先类,因此,一个接收Enumerable作为参数的方法可以接收数组和列表。
我想知道在Java中是否有类似的东西?
不,Java 中没有相应的等价物。通常建议您设计 API 方法来接收 List<T>
、Collection<T>
或 Iterable<T>
。虽然这样会排除使用数组直接调用该方法的可能性,但您可以很容易地使用 Arrays.asList
将数组包装起来。与将数组作为方法参数指定强制执行单个实现相比,这对调用者更加灵活。
我同意这并不理想。
请注意,在 .NET 中,单维数组不仅实现了 IEnumerable<T>
接口,还实现了 IList<T>
接口。
它们没有共同的祖先,不过有方法可以根据需要在两种类型之间进行转换 -
所以你可以提供一个重载的方法来转换为通用类型 - 例如:public void doAll(MyType[] array) {
doAll(Arrays.asList(array));
}
public void doAll(List<MyType> list) {
//... process List here.
}
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);
基本上,数组具有隐式类型,该类型是对象的子类。请参见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.
如果考虑到泛型,情况会更糟。总的来说,我不知道这种设计的理由是什么,但是我们必须接受它。
Iterable<T>
是 Java 中 IEnumerable<T>
的等价物。所有/大多数集合都实现了这个接口(包括 ArrayList
和数组),所以是的。但它不是“祖先”(在 .NET 中也不是),而是一个公共接口。
它们都派生自java.lang.Object
。然而,这与集合无关,我想这不是你要找的。