Высший тип
Высший тип (универсальный супертип) — тип, применяемый в ряде теорий типов и языков программирования, который содержит каждый возможный объект системы. Высший тип иногда именуется универсальным супертипом, то есть все остальные типы в любой отдельно взятой системе типов являются подтипами самого верхнего. Двойственное понятие — низший тип (универсальный подтип), не содержащий никаких возможных значений или подтипов.
Поддержка в языках программирования
Языки программирования с явной поддержкой высшего типа. Большинство объектно-ориентированных языков программирования включают универсальный базовый класс:
Название | Языки |
---|---|
Object |
Smalltalk, Java, JavaScript, Ruby и некоторые другие. В Java он часто обозначается с префиксом, указывающим на пакет, например, java.base/java/lang/Object. При этом Object не является супертипом для примитивных типов в Java; однако, начиная с Java 1.5, упаковка (autoboxing) позволяет выполнять явное или неявное приведение примитива к Object , например, ((Object)42).toString() .
|
Object |
Objective-C. В OpenStep и Cocoa, которые являются самыми популярными фреймворками на базе языка, NSObject — как правило это универсальный базовый класс. Можно создавать новые корневые классы просто не указывая родительские классы при определении, но это крайне не рекомендуется. Высшим типом для указателей на объект является id. |
System.Object |
C#, Visual Basic .NET и прочие языки платформы .NET Framework |
object |
Python, начиная с унификации типов и классов в версии 2.2. |
GObject |
Glib |
TObject |
Object Pascal. [www.delphibasics.co.nr/RTL.asp?Name=TObject] |
t |
Common Lisp и множество прочих диалектов Lisp. |
Any |
Scala. X10, Kotlin. |
GENERAL |
Eiffel. |
UNIVERSAL |
Perl 5. |
Variant |
Visual Basic вплоть до 6-й версии. |
C++ выделяется среди объектно-ориентированных языков тем, что не имеет универсального супертипа. Тип «указатель на void» может принимать указатель на любой объект, даже несмотря на то, что void-тип сам по себе не является универсальным типом, а лишь единичным типом.
Необъектно-ориентированные языки обычно не имеют универсального супертипа (или полностью поддерживают полиморфизм подтипов). Common Lisp является исключение в том плане, что его встроенные типы образуют иерархию типов, даже когда его объектная система CLOS не используется.
В большинстве языков программирования высший тип — это абстрактный тип, который не содержит элементов, не являющихся элементами некоторого (объявленного) подтипа. В данном случае Java является исключением: выражение new Object()
вполне корректно.
Высший тип используется как обобщённый тип, в первую очередь в языках без поддержки параметрического полиморфизма. Например, до добавления обобщённых типов в Java 5, коллекция классов в библиотеке Java (исключая массивы Java) поддерживали ссылки на тип Object
; при этом способе любой несобственный тип может быть добавлен в коллекцию. Высший тип также часто используется для поддержки объектов неизвестного типа.
В языках со структурной системой типов высший тип — это пустая структура. Например, объекты в OCaml структурно типизированы; пустой тип объекта (тип объекта, не имеющего методов), «< >
», — высший тип для объектных типов. Любой объект в OCaml может быть явным образом приведен к этому типу, хотя результат может быть довольно бесполезным.
Высший тип может также быть представлен как неявный тип в языках с нестатической типизацией. Языки с динамической типизацией часто поддерживают понижающее приведение (или «уточнение типа» (type refinement)) для предоставления программисту возможности указывать более специфический тип для объекта в ходе выполнения программы. Необходимо отметить, что понижающее приведение из типа void *
в языке C++ не может быть выполнено в «безопасном» стиле, когда неудачное приведение выявляется средой языка.
Литература
- Пирс Б. Типы в языках программирования. — Добросвет, 2012. — 680 с. — ISBN 978-5-7913-0082-9.