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