java数组和列表的共同祖先

44u64gxh  于 2021-07-06  发布在  Java
关注(0)|答案(6)|浏览(293)

在.net中,数组和列表都有可枚举作为祖先,因此接受可枚举作为参数的方法可以同时接收数组和列表作为其参数。我想知道java中是否有类似的东西?

zzlelutf

zzlelutf1#

两者都源于 java.lang.Object . 不过,这与收藏无关,我想这正是你要找的。

oalqel3c

oalqel3c2#

基本上,数组有一个隐式类型,它是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<Object> l = new ArrayList<String>(); // complain 
Object[] l2 = new String[1]; // ok

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

如果我们考虑泛型,情况会更糟,但那是另一个主题。总而言之,我不知道这种设计的基本原理,但我们需要接受它。

k4emjkb1

k4emjkb13#

Iterable<T> java是否等同于 IEnumerable<T> . 所有/大多数集合都实现此接口(包括 ArrayList 和数组),所以是的。但它不是“祖先”(也不在.net中),而是一个公共接口。

btqmn9zl

btqmn9zl4#

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);
umuewwlo

umuewwlo5#

不,在java中没有等价物。我通常建议您设计api方法来接收 List<T> , Collection<T> 或者 Iterable<T> . 虽然这些方法不允许直接使用数组调用方法,但是可以使用 Arrays.asList . 对于调用方来说,这比将数组指定为方法参数更为灵活,后者强制单个实现。
我同意这并不理想。
注意,在.net中,一维数组不仅仅实现 IEnumerable<T> -他们实施 IList<T> 也。

mznpcxlj

mznpcxlj6#

它们没有共同的祖先,但是,有一些方法可以根据需要在这两种类型之间转换-
list.toarray()
arrays.aslist()
因此,您可以提供一个重载方法来强制转换为一个公共类型,即。

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

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

相关问题