Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Массив и список в 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);

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top