Я исследую язык Scala. Одно требование, которое я часто слышу, состоит в том, что у Scala есть более сильная система типов, чем Java. Этим я думаю, какие средние люди то, что:
scalac
отклоняет определенные ошибочные программы который javac
скомпилирует счастливо, только для порождения ошибки периода выполнения.Действительно ли я прав в размышлении так?
Основное преимущество системы типов Scala не столько в том, что она сильнее , сколько в том, что она намного богаче (см. « Система типов Scala »).
(Java может определять некоторые из них и реализовывать другие, но в Scala они встроены).
См. Также Создатели мифов 1: «Типы типов» Scala , комментируя сообщение в блоге Стива Йегге , где он «отвергает» Scala как «монстра Франкенштейна», потому что «существуют типы типов, и тип тип типы ».
(type1,…) => returnType
синтаксис), + T
объявляет, что тип T
будет использоваться только в ковариантных позициях. Стек [T]
- это подтип Стек [S]
, если T
является подтипом S
. -T
объявляют, что T
используется только в контравариантных позициях.Основная проблема безопасности Java связана с дисперсией. По сути, программист может использовать неправильные объявления отклонений, которые могут привести к возникновению исключений во время выполнения в Java, в то время как Scala не позволит этого.
Фактически, тот факт, что Java Array
является ковариантным, уже является проблемой, поскольку он позволяет сгенерировать неправильный код. Например, как показано в sepp2k :
String[] strings = {"foo"};
Object[] objects = strings;
objects[0] = new Object();
Тогда, конечно, в Java есть необработанные типы, которые позволяют все виды вещей.
Кроме того, хотя в Scala это тоже есть, есть приведение типов. Java API богат на приведение типов, и нет такой идиомы, как в Scala case x: X => // x теперь безопасно приведено
. Конечно, в одном случае для этого используется instanceof
, но для этого нет никакого стимула. Фактически, Scala asInstanceOf
намеренно многословен.
Это то, что делает систему типов Scala сильнее. Как показывает VonC , он также намного богаче.