Преимущества система типов в Scala
Я изучаю язык Scala. Одно утверждение, которое я часто слышу, это то, что у Scala есть сильнее тип системы, чем Java. Под этим я думаю, что люди имеют в виду, что:
-
scalac
отвергает некоторые глючные программы, которыеjavac
счастливо компиляции, только чтобы вызвать ошибку во время выполнения. - некоторые инварианты могут быть закодированы в программе Scala таким образом, что компилятор не позволит программисту написать код, который нарушает состояние.
Я прав, думая так?
2 ответа:
главным преимуществом системы типа Scala является не столько бытие сильнее а далеко богаче (см. "Система Типа Scala").
(Java может определить некоторые из них и реализовать другие, но Scala имеет их встроенный).
Смотрите также The Myth Makers 1: Scala 'S" Type Types", комментируя Стив Yegge блог, где он "отшил" Скала "монстр", потому что "есть тип типы и типы типов типа".
- классы типов значений (полезно для достаточно небольших структур данных, которые имеют семантику значений), используемые вместо типов примитивов (Int, Doubles,...), с неявным преобразованием в" богатые " классы для дополнительных методов.
- столбцами типа
- типы монад
- типы признаков (и миксин состав это идет с ним)
- Синглтон типы объектов (просто определите "объект" , и у вас есть один),
- типы соединения (пересечения типов объектов, чтобы выразить, что тип объекта является подтипом нескольких других типов),
- функциональные типы (
(type1, …)=>returnType
синтаксис),- Case classes (регулярные классы, которые экспортируют свои параметры конструктора и которые обеспечивают рекурсивный механизм декомпозиции через шаблон совпадение),
- зависимые от пути типы (языки, которые позволяют вам вложить типы, предоставляют способы ссылаться на эти пути типа),
- анонимные типы (для определения анонимных функций),
- Self types (можно используется, например, в Trait),
- псевдонимы типа, вместе с:
- пакета объектов (введена в 2.8)
- универсального типа (как Java), с тип параметра аннотации механизма для управления поведением подтипов универсальных типов,
- ковариантные универсальные типы: аннотация
+T
объявляет типаT
используется только в ковариантной позиции.Stack[T]
является подтипомStack[S]
еслиT
является подтипомS
.- Контравариантные обобщенные типы:
-T
объявитьT
используется только в контравариантном должностное положение.- ограниченные общие типы (даже если Java поддерживает некоторую его часть),
- высшее kinded типов, которые позволяют выражать более сложные отношения типов, чем это возможно с генераторами Java,
- абстрактные типы (альтернатива универсальному типу),
- экзистенциальных типов (используется в Scala как подстановочный знак Java типа),
- неявные типы (см."удивительность Scala неявна",
- просмотр ограниченных типов и
- структурные типы, для указания типа путем указания характеристик желаемого типа (duck typing).
основная проблема безопасности с Java связана с дисперсией. В принципе, программист может использовать неверные объявления дисперсии, которые могут привести к возникновению исключений во время выполнения в Java, в то время как Scala не позволит этого.
на самом деле, тот самый факт, что Java
Array
is co-variant уже является проблемой, поскольку он позволяет генерировать неверный код. Например, на примере 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 показывает.