В .NET оба массива и списка имеют Enumerable в качестве предка, поэтому метод, который принимает Enumerable в качестве аргумента, может принимать как массив, так и список в качестве аргумента. Интересно, есть ли аналогичная вещь в Java?
Общий предшественник массива Java и список
Ответ 1
Нет, в Java нет эквивалента. Обычно я предлагаю вам разработать методы API для получения List<T>
, Collection<T>
или Iterable<T>
. Хотя это исключает возможность прямого вызова метода с помощью массива, вы можете легко массировать массив, используя Arrays.asList
. Это более гибко для вызывающего, чем указание массива как параметра метода, который заставляет одну реализацию.
Я согласен, что это не идеальный вариант.
Обратите внимание, что в .NET одномерные массивы не просто реализуют IEnumerable<T>
- они также реализуют IList<T>
.
Ответ 2
У них нет общего предка, однако есть способы бросить между этими двумя типами по мере необходимости -
Таким образом, вы можете предоставить перегруженный метод для преобразования в общий тип - т.е.
public void doAll(MyType[] array) {
doAll(Arrays.asList(array));
}
public void doAll(List<MyType> list) {
//... process List here.
}
Ответ 3
Массив и список в 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);
Ответ 4
В принципе, массивы имеют неявный тип, который является подклассом объекта. См. Arrays в 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.
Это становится еще хуже, если мы рассмотрим дженерики, но это другая тема. В общем, я не знаю обоснования этого дизайна, но нам нужно жить с ним.
Ответ 5
Оба получаются из java.lang.Object
. Однако это не связано с коллекцией, и я думаю, это то, что вы ищете.
Ответ 6
Iterable<T>
является эквивалентом Java IEnumerable<T>
. Все/большинство коллекций реализуют этот интерфейс (включая ArrayList
и массивы), так что да. Но это не "предок" (который он тоже не в .NET), а общий интерфейс.