Преимущества системы типов Scala
Я изучаю язык Scala. Я часто слышу одно утверждение, что у Scala более сильная система типов, чем у Java. Под этим я думаю, что люди имеют в виду следующее:
scalac
отвергает определенные глючные программы, которыеjavac
скомпилируется счастливо, только чтобы вызвать ошибку во время выполнения.- Определенные инварианты могут быть закодированы в программе Scala, так что компилятор не позволит программисту написать код, который нарушает условие.
Правильно ли я так думаю?
2 ответа
Основное преимущество системы Scala Type заключается не в том, чтобы быть сильнее, а в том, что она намного богаче (см. " Система типов Scala").
(Java может определять некоторые из них и реализовывать другие, но в Scala они встроены).
См. Также "Создатели мифов 1:" Типы типов "в Scala, комментируя сообщение в блоге Стива Йегге, где он" называет " Scala" Монстром Франкенштейна ", потому что" существуют типы типов и типы типов ".
- Классы типов значений (полезные для достаточно небольших структур данных, имеющих семантику значений), используемые вместо типов примитивов (Int, Doubles, ...), с неявным преобразованием в "Rich" классы для дополнительных методов.
- Не обнуляемый тип
- Типы монад
- Типы черт (и миксиновый состав, который идет с ним)
- Типы объектов Singleton (просто определите "объект", и у вас есть один),
- Составные типы (пересечения типов объектов, чтобы выразить, что тип объекта является подтипом нескольких других типов),
- Функциональные типы (
(type1, …)=>returnType
синтаксис), - Классы Case (обычные классы, которые экспортируют свои параметры конструктора и предоставляют механизм рекурсивной декомпозиции посредством сопоставления с образцом),
- Типы, зависящие от пути (языки, которые позволяют вам вкладывать типы, предоставляют способы обращения к этим типам путей),
- Анонимные типы (для определения анонимных функций),
- Самостоятельные типы (могут использоваться, например, в Trait),
- Введите псевдонимы вместе с:
- объект пакета (введен в 2.8)
- Универсальные типы (такие как Java), с механизмом аннотации параметра типа для управления поведением подтипов универсальных типов,
- Ковариантные родовые типы: аннотация
+T
объявляет типT
использоваться только в ковариантных позициях.Stack[T]
это подтипStack[S]
еслиT
это подтипS
, - Контравариантные родовые типы:
-T
объявил быT
использоваться только в контравариантных позициях.
- Ковариантные родовые типы: аннотация
- Ограниченные универсальные типы (хотя Java поддерживает некоторую его часть),
- Типы с более высоким родом, которые позволяют выразить более сложные отношения типов, чем это возможно в Java Generics,
- Абстрактные типы (альтернатива универсальному типу),
- Экзистенциальные типы (используются в Scala как тип подстановочных знаков Java),
- Неявные типы (см. " Потрясающая Scala неявная",
- Просмотр ограниченных типов и
- Структурные типы, для указания типа путем указания характеристик нужного типа (типирование утки).
Основная проблема безопасности с 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 is now safely cast
, Конечно, один случай использования instanceof
чтобы достичь этого, но нет никакого стимула для этого. На самом деле, Скала asInstanceOf
намеренно многословно.
Это то, что делает систему типов Scala сильнее. Это также намного богаче, как показывает VonC.