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