Тип верха
В математической логике и информатике некоторые теории типов и системы типов включают верхний тип , который обычно обозначается буквой top или символом ⊤. Верхний тип иногда называют также универсальным типом или универсальным супертипом , поскольку все остальные типы в интересующей системе типов являются его подтипами и в большинстве случаев содержат все возможные объекты системы типов. Это контрастирует с нижним типом или универсальным подтипом , супертипом которого является любой другой тип, и часто тип вообще не содержит членов.
Поддержка языков программирования
[ редактировать ]Некоторые типизированные языки программирования обеспечивают явную поддержку верхнего типа.
В статически типизированных языках при обсуждении верхнего типа существуют две разные, часто путаемые концепции.
- Универсальный базовый класс или другой элемент наверху времени выполнения иерархии классов (часто актуальной в объектно-ориентированном программировании ) или иерархии типов ; часто можно создавать объекты с этим типом (время выполнения) или его можно найти при программном исследовании иерархии типов на языках, которые его поддерживают.
- ( время компиляции ) Статический тип в коде, переменным которого можно присвоить любое значение (или его подмножество, например любое значение указателя объекта), аналогично динамической типизации.
Первое понятие часто подразумевает второе, т. е. если существует универсальный базовый класс, то переменная, которая может указывать на объект этого класса, может также указывать на объект любого класса. Однако в некоторых языках есть типы, относящиеся ко второму аспекту, указанному выше (например, void *
в С++, id
в Objective-C, interface {}
в Go), статические типы, переменные которых могут принимать любое значение объекта, но которые не отражают типы реального времени выполнения, которые объект может иметь в системе типов, поэтому в первую очередь не являются верхними типами.
В динамически типизированных языках второй концепции не существует (в любом случае любой переменной можно присвоить любое значение), поэтому обсуждается только первая (иерархия классов). В этой статье мы пытаемся придерживаться первой концепции при обсуждении основных типов, но также упоминаем вторую концепцию в языках, где она важна.
Имя | Языки |
---|---|
Object | Smalltalk , JavaScript , Ruby (до 1.9.2), [1] и некоторые другие. |
java.lang.Object | Ява . Часто пишется без префикса пакета, например Object . Кроме того, это не супертип примитивных типов; однако, начиная с Java 1.5, автоупаковка позволяет неявное или явное преобразование типа примитивного значения в Object , например, ((Object)42).toString() |
System.Object [2] | C# , Visual Basic .NET и другие .NET Framework. языки |
std::any | C++ начиная с C++17 |
object | Python с момента унификации типа/класса [3] в версии 2.2 (только объекты нового стиля; в объектах старого стиля в 2.x этот базовый класс отсутствует). Новый модуль набора текста представляет тип Any который совместим с любым типом и наоборот |
TObject | Объектный Паскаль |
t | Lisp , многие диалекты, такие как Common Lisp |
Any? | Котлин [4] |
Any | Скала , [5] Быстрый , [6] Юля , [7] Питон [8] |
ANY | Эйфелева [9] |
UNIVERSAL | Перл 5 |
Variant | Visual Basic до версии 6, D [10] |
interface{} | Идти |
BasicObject | Ruby (версия 1.9.2 и выше) |
any и unknown [11] | TypeScript (с unknown был представлен в версии 3.0 [12] ) |
mixed | PHP (начиная с версии 8.0) |
Следующие объектно-ориентированные языки не имеют универсального базового класса:
- С++ . Указатель на тип void может принимать любой указатель, не являющийся функцией, даже если сам тип void является не универсальным типом, а типом единицы . Начиная с C++17, стандартная библиотека предоставляет верхний тип.
std::any
. - Цель-С . Можно создать новый базовый класс, не указывая родительский класс для класса, хотя это весьма необычно.
Object
традиционно используется в качестве базового класса в исходной среде выполнения Objective-C. В библиотеках OpenStep и Cocoa Objective-CNSObject
традиционно является универсальным базовым классом. Верхний тип указателей на объекты:id
. - Быстрый . Можно создать новый базовый класс, не указывая родительский класс для класса. Протокол
Any
может принять любой тип.
Другие языки
[ редактировать ]Языки, которые не являются объектно-ориентированными, обычно не имеют поддержки универсального супертипа или полиморфизма подтипов.
Хотя в Haskell намеренно отсутствуют подтипы, в нем есть несколько других форм полиморфизма, включая параметрический полиморфизм . Самый общий параметр класса типа — это неограниченный параметр. a
(без ограничения класса типа ). В Русте , <T: ?Sized>
является наиболее общим параметром ( <T>
нет, поскольку это подразумевает Sized
черта по умолчанию).
Верхний тип используется как универсальный тип, особенно в языках без параметрического полиморфизма . Например, до появления дженериков в Java 5 классы коллекций в библиотеке Java (за исключением массивов Java) содержали ссылки типа Object
. Таким образом, в коллекцию можно было бы вставить любой невнутренний тип. Верхний тип также часто используется для хранения объектов неизвестного типа.
Верхний тип также можно рассматривать как подразумеваемый тип нестатически типизированных языков. Языки с типизацией во время выполнения часто предоставляют понижающее приведение (или уточнение типа ), чтобы позволить обнаружить более конкретный тип объекта во время выполнения. В C++ понижающее приведение от void *
не может быть выполнено безопасным способом, поскольку неудачное приведение типов обнаруживается средой выполнения языка.
В языках со структурной системой типов пустая структура служит верхним типом. Например, объекты в OCaml структурно типизированы; пустой тип объекта (тип объектов без методов), < >
, является верхним типом типов объектов. Любой объект OCaml можно явно преобразовать в этот тип, хотя результат будет бесполезен. Go также использует структурную типизацию; и все типы реализуют пустой интерфейс: interface {}
, который не имеет методов, но все равно может быть преобразован обратно к более конкретному типу.
В логике
[ редактировать ]Понятие вершины также встречается в исчислении высказываний и соответствует формуле, которая верна во всех возможных интерпретациях. Аналогичное значение оно имеет и в исчислении предикатов . В логике описания top используется для обозначения набора всех концепций. Интуитивно это похоже на использование верхнего типа в языках программирования. Например, в языке веб-онтологии (OWL), который поддерживает различную логику описания, top соответствует классу owl:Thing
, где все классы являются подклассами owl:Thing
. (нижний тип или пустой набор соответствует owl:Nothing
).
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ «Класс: BasicObject (Ruby 1.9.2)» . Проверено 7 апреля 2014 г.
- ^ Система.Объект
- ^ Объединение типа/класса Python
- ^ Матилла, Хьюго (27 февраля 2019 г.). «Основы Kotlin: типы. Any, Unit и Nothing» . Середина . Проверено 16 сентября 2019 г.
- ^ «Обзор языка программирования Scala» (PDF) . 2006 год . Проверено 7 апреля 2014 г.
- ^ «Типы — язык программирования Swift (Swift 5.3)» . docs.swift.org . Проверено 2 ноября 2020 г.
- ^ «Типы · Язык Джулии» . Проверено 15 мая 2021 г.
- ^ «Любой тип» . 2022 . Проверено 26 октября 2022 г.
- ^ «Стандарт ECMA-367. Eiffel: язык анализа, проектирования и программирования» (PDF) . 2006 год . Проверено 10 марта 2016 г.
- ^ «std.variant — Язык программирования D» . dlang.org . Проверено 29 октября 2022 г.
- ^ «Верхние типы «любой» и «неизвестный» в TypeScript» .
- ^ «Неизвестный тип в TypeScript» . 15 мая 2019 г.