Java 数组与 Scala 数组

标签 java arrays scala

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

最佳答案

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

因为 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 中,它们总是协变的。

拥有协变数组被视为允许像 sort(Object[] objects) 这样的“通用”方法的实用方法。早在有人想到在 Java 中使用泛型之前。那已经过去将近 20 年了。如您所见,“现代”方式是:以不同的方式做事。

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

关于Java 数组与 Scala 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39442983/

相关文章:

scala - 在scala中使用流定义系列

scala - 如何退出 sbt 任务?

java - 最多 2 个对象的 Java Set

java - 如何从基本时间间隔减去间隔后获取剩余间隔列表

java - JERSEY-RS 在 POST 中显示 405

javascript - 显示输出时遇到问题

scala - 从光滑表定义创建表

java - 如何在 Swing 中创建延迟

c - 如何打印具有字节值的字符串数组

c++ - 使用函数创建数组 - Objective-C++