Общий предок для массива и списка Java - PullRequest
15 голосов
/ 14 марта 2010

В .NET и массив, и список имеют Enumerable в качестве предка, поэтому метод, принимающий Enumerable в качестве аргумента, может получить массив и список в качестве аргумента. Интересно, есть ли подобное в Java?

Ответы [ 6 ]

21 голосов
/ 14 марта 2010

Нет, в Java нет эквивалента.Я бы вообще предложил вам разрабатывать методы API для получения List<T>, Collection<T> или Iterable<T>.Хотя это исключает прямой вызов метода с массивом, вы можете очень легко обернуть массив с помощью Arrays.asList.Это более гибко для вызывающей стороны, чем указание массива в качестве параметра метода, что вызывает единственную реализацию.

Я согласен, что это не идеально.

Обратите внимание, что в .NET одномерныймассивы не просто реализуют IEnumerable<T> - они также реализуют IList<T>.

4 голосов
/ 14 марта 2010

У них нет общего предка, однако есть методы для приведения между двумя типами по мере необходимости -

Таким образом, вы можете предоставить перегруженный метод для приведения к общему типу - т.е.

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

public void doAll(List<MyType> list) {
    //... process List here.
}
3 голосов
/ 14 марта 2010

Массив и Список в 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);
2 голосов
/ 27 октября 2014

Iterable<T> - это эквивалент Java IEnumerable<T>. Все / большинство коллекций реализуют этот интерфейс (включая ArrayList и массивы), так что да. Но это не «предок» (которого нет в .NET), а общий интерфейс.

2 голосов
/ 14 марта 2010

По сути, массивы имеют неявный тип, который является подклассом объекта. См. Массивы в 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.

Становится еще хуже, если мы рассмотрим дженерики, но это уже другая тема. В общем, я не знаю обоснования этого дизайна, но мы должны жить с ним.

1 голос
/ 14 марта 2010

Оба получены из java.lang.Object. Тем не менее, это не связано с коллекцией, что я думаю, это то, что вы ищете.

...