在.NET中,数组和列表都具有Enumerable作为祖先,因此接受Enumerable作为参数的方法可以接收数组和列表作为其参数。 我想知道Java中是否有类似的东西?
答案 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
。但是,这不是与收集相关的,我认为这正是您所寻找的。 p>