2016-09-12 3 views
4

Кажется, что одно отличие между Java Array и Scala Array - это Java-массив. Scala Array - нет. Оба являются изменяемыми. В java метод сортировки может принимать разные массивы, такие как массивы String или Int. Это часто цитируется как хороший пример принципа замещения Лискова. Кажется хорошим дизайном для меня? В Scala мы знаем, что Array не является совместным вариантом. Хотя Scala Array разрабатывается позже, чем Java. Я не вижу, как Scala Array лучше в аспекте со-дисперсии. У него, вообще говоря, это лучше, чем Java.Java Array vs Scala Array

+0

Если я правильно понял, вы, кажется, ответили на свой вопрос ... –

+0

Scala обогащает 'Array (1,2,3) .find (_ == 2)', но также https://github.com/ lihaoyi/fastparse/issues/126 также http://docs.scala-lang.org/overviews/collections/arrays.html –

ответ

10

Когда вы посмотрите дальше, вы обнаружите, что отцы языка Java позже решили сделать Generics не covariant. И это по уважительным причинам.

Поскольку List<Apple> не является List<Fruit>. В противном случае, вы могли бы сделать что-то вроде

List<Apple> apples = new ArrayList<>(); 
List<Fruit> fruits = apples; 
fruits.add(new Banana()); 

но Wouldnt вы ожидаете, что

Apple badApple = apples.get(0); 

безопасный вызов? Если вы допускаете ковариацию здесь, это не так!

И удивление: проблема, с которой связаны массивы Java!

Таким образом, проблема в том, что массивы Java являются ковариантными! И лучше, чтобы массивы Scala фактически позволяли вам точно контролировать свою «дисперсию». В Scala у вас есть полный контроль над дисперсией; тогда как в Java они всегда ковариантны.

Наличие ковариантных массивов рассматривалось как прагматичный способ использования «общих» методов, таких как sort(Object[] objects) задолго до того, как кто-либо подумал о наличии дженериков в Java. Это почти 20 лет назад. «Современный» способ, как вы можете видеть: делать вещи по-другому.

«Стоимость» этого решения заключается в том, что Java также знает ArrayStoreException. Это не было бы необходимо, если бы Java-массивы не были бы ковариантными!

+1

Стоит также отметить, что генераторы Scala по умолчанию инвариантны, но могут быть объявлены как ковариантные или контравариантные, если необходимо - например, 'scala.collection.Iterrable' является ковариантным (а коллекции Scala вообще ковариантны - я не знаю, есть ли исключения, кроме массивов?). Безопасность дисперсии проверяется компилятором. –

+0

Вопрос задавал java Array, но ваш пример был List. – johnsam

+0

Позволяет отступить: вы спросили: «Что не так с ковариантными массивами». Я объяснил вам фактическую проблему, которую ** имеют ковариантные ** «коллекции». Другими словами: «Посмотрите, у списков нет этой проблемы X здесь». Вам действительно нужно, чтобы я сказал вам ", и это означает, что у массивов очень хорошая проблема X" ?! Вместе с этим комментарием от @ Cyäegha вы действительно получили всю необходимую информацию! Но хорошо, кажется, так; таким образом, я обновил свой ответ. – GhostCat