Общий предок к массиву Java и списку

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

17
задан Phương Nguyễn 14 March 2010 в 13:45
поделиться

5 ответов

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

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

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

22
ответ дан 30 November 2019 в 12:07
поделиться

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

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

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

public void doAll(List<MyType> list) {
    //... process List here.
}
4
ответ дан 30 November 2019 в 12:07
поделиться

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

1
ответ дан 30 November 2019 в 12:07
поделиться

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

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

2
ответ дан 30 November 2019 в 12:07
поделиться

Array и List в 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);
3
ответ дан 30 November 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: