Ответ 1
Существует невероятное количество типов, которые "известны" компилятору, и имеют особую разницу в разной степени. Полный список можно найти в файле Definitions.scala.
Мы можем, вероятно, классифицировать их в зависимости от степени их особой важности.
Отказ от ответственности: я, вероятно, забыл еще несколько.
Специально для системы типов
В системе типа Scala важны следующие типы. Они влияют на то, как выполняется проверка типа. Все эти типы упоминаются в спецификации (или, по крайней мере, они обязательно должны быть).
-
Any
,AnyRef
,AnyVal
,Null
,Nothing
: пять типов, которые располагаются в верхней и нижней части системы типа Scala. -
scala.FunctionN
, (канонический) тип, заданный анонимными функциями (включая eta-расширение). Даже в версии 2.12, которая имеет обработку анонимных функций SAM, в некоторых случаях (особенно при перегрузке разрешения) сохраняется специальная функцияFunctionN
. -
scala.PartialFunction
(влияет на работу типа) -
Unit
- Все типы с буквальной нотацией:
Int
,Long
,Float
,Double
,Char
,Boolean
,String
,Symbol
,java.lang.Class
- Все числовые примитивные типы и
Char
s, для слабой совместимости (вместе эти две пули охватывают все примитивные типы) -
Option
и кортежи (для сопоставления с образцом и автоматической настройки) -
java.lang.Throwable
-
scala.Dynamic
-
scala.Singleton
- Большая часть
scala.reflect.*
, в частностиClassTag
,TypeTag
и т.д. -
scala.annotation.{,ClassFile,Static}Annotation
- Почти все аннотации в
scala.annotation.*
(например,unchecked
) -
scala.language.*
-
scala.math.ScalaNumber
(по неясным причинам)
Известен компилятором как обесцвечивание некоторых языковых функций
Следующие типы не имеют решающего значения для системы типов. Они не влияют на проверку типов. Однако в языке Scala имеется ряд конструктов, которые desugar в выражениях этих типов.
Эти типы также будут упомянуты в спецификации.
-
scala.collection.Seq
,Nil
иWrappedArray
, которые используются для параметров varargs. -
TupleN
типы -
Product
иSerializable
(для классов case) -
MatchError
, сгенерированный конструкциями соответствия шаблонов -
scala.xml.*
-
scala.DelayedInit
-
List
(компилятор выполняет некоторые тривиальные оптимизации для таких, как переписываниеList()
какNil
)
Известный для реализации языка
Это, вероятно, список, о котором вы больше всего заботитесь, учитывая, что вы сказали, что вам интересно узнать, что может пойти по-другому на разных концах. Предыдущие категории обрабатываются ранними (front-end) фазами компилятора и поэтому разделяются между Scala/JVM, Scala.js и Scala Native. Эта категория, как правило, известна как составная часть компилятора, и, следовательно, потенциально имеет разные методы лечения. Обратите внимание, что как Scala.js, так и Scala Native попытаются подражать семантике Scala/JVM в разумной степени.
Эти типы могут не упоминаться в спецификации языка как таковой, по крайней мере, не для всех.
Вот те, в которых согласны концы (re Scala Родные, насколько мне известно):
- Все примитивные типы:
Boolean
,Char
,Byte
,Short
,Int
,Long
,Float
,Double
,Unit
. -
scala.Array
. -
Cloneable
(в настоящее время не поддерживается в Scala Native, см. # 334) -
String
иStringBuilder
(в основном для конкатенации строк) -
Object
, для практически всех его методов
И вот те, где они не согласны:
- Вставные версии примитивных типов (например,
java.lang.Integer
) -
Serializable
-
java.rmi.Remote
иjava.rmi.RemoteException
- Некоторые аннотации в
scala.annotation.*
(например,strictfp
) - Некоторые вещи в
java.lang.reflect.*
, используемые Scala/JVM для реализации структурных типов
Кроме того, хотя сами типы не являются типами, но длинный список примитивных методов также обрабатываются в обратном порядке.
Типы, специфичные для платформы
В дополнение к перечисленным выше типам, которые доступны на всех платформах, платформы, не поддерживающие JVM, добавляют свои собственные специальные типы для обеспечения совместимости.
Scala.js-специфичные типы
-
js.Any
: концептуально третий подтипAny
, кромеAnyVal
иAnyRef
. У них есть семантика JavaScript вместо семантики Scala. -
String
и в коробчатых версиях всех примитивных типов (сильно переписанных - так называемых "захваченных" - компилятором) -
js.ThisFunctionN
: их методыapply
ведут себя иначе, чем методы других типов JavaScript (первый фактический аргумент становитсяthisArgument
вызываемой функции) -
js.UndefOr
иjs.|
(они ведут себя как типы JS, даже если они не расширяютjs.Any
) -
js.Object
(new js.Object()
имеет специальную форму как пустой литерал объекта JS{}
) -
js.JavaScriptException
(ведет себя очень специально вthrow
иcatch
) -
js.WrappedArray
(используется десурагированием varargs) -
js.ConstructorTag
(аналогичноClassTag
) - Аннотация
js.native
и все аннотации вjs.annotation.*
Кроме того, еще дюжина примитивных методов.
Scala Родные типы
- Целые числа без знака:
UByte
,UShort
,UInt
иULong
-
Ptr
, тип указателя -
FunctionPtrN
, типы указателей функций - Аннотации в
native.*
- Несколько дополнительных примитивных методов в
scala.scalanative.runtime