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.
6条答案
按热度按时间zzlelutf1#
两者都源于
java.lang.Object
. 不过,这与收藏无关,我想这正是你要找的。oalqel3c2#
基本上,数组有一个隐式类型,它是object的子类。请参见jls中的阵列:
当我们考虑协方差/逆方差时,处理数组和列表的方式也不一样。
如果我们考虑泛型,情况会更糟,但那是另一个主题。总而言之,我不知道这种设计的基本原理,但我们需要接受它。
k4emjkb13#
Iterable<T>
java是否等同于IEnumerable<T>
. 所有/大多数集合都实现此接口(包括ArrayList
和数组),所以是的。但它不是“祖先”(也不在.net中),而是一个公共接口。btqmn9zl4#
java中的数组和列表不共享java.lang.object以外的共同祖先。
两者都可以使用foreach循环访问,如下所示:
umuewwlo5#
不,在java中没有等价物。我通常建议您设计api方法来接收
List<T>
,Collection<T>
或者Iterable<T>
. 虽然这些方法不允许直接使用数组调用方法,但是可以使用Arrays.asList
. 对于调用方来说,这比将数组指定为方法参数更为灵活,后者强制单个实现。我同意这并不理想。
注意,在.net中,一维数组不仅仅实现
IEnumerable<T>
-他们实施IList<T>
也。mznpcxlj6#
它们没有共同的祖先,但是,有一些方法可以根据需要在这两种类型之间转换-
list.toarray()
arrays.aslist()
因此,您可以提供一个重载方法来强制转换为一个公共类型,即。