Java阵列与Scala阵列

时间:2016-09-12 03:31:13

标签: java arrays scala

似乎Java Array和Scala Array之间的一个区别是Java Array是变体。 Scala数组不是。两者都是可变的。在java中,sort方法可以使用不同的数组,例如String或Int数组。这经常被引用作为Liskov替代原则的一个很好的例子。对我来说似乎是个好设计?在Scala中,我们知道Array不是变体。虽然Scala Array的设计晚于Java。我不知道Scala Array在协方差方面是如何更好的。它有通用可能这比Java好。

1 个答案:

答案 0 :(得分:10)

当你进一步观察时,你会发现Java语言的父亲后来决定使Generics 协变。这是有充分理由的。

因为List<Apple>不是List<Fruit>。否则,您可以执行

之类的操作
List<Apple> apples = new ArrayList<>();
List<Fruit> fruits = apples;
fruits.add(new Banana());

但是你没想到

Apple badApple = apples.get(0);

是安全的电话吗?如果你在这里允许协方差,那就不是了!

并且惊讶:这是Java阵列的问题!

因此,Java数组是协变的,实际上是一个问题!最好是Scala数组实际上允许您精确控制它们的“方差”。在Scala中,您可以完全控制方差;而在Java中,它们总是协变的。

在任何人想到在Java中使用泛型之前,有了协变数组被认为是允许像sort(Object[] objects)这样的“通用”方法的实用方法。那是近20年。正如你所看到的那样,“现代”的方式是:以不同的方式做事。

这个决定的“代价”是Java也知道ArrayStoreException。如果Java数组不是协变的,那就没有必要了!