Вищий тип

Вищий тип (top type) в теорії типів, часто позначається як просто вершина або "закріпленим" символом (⊤), - універсальний тип, тобто такий тип, який містить в собі кожен можливий об'єкт в потрібній системі типів. Вищий тип іноді іменується універсальним супертіп, тобто всі інші типи в будь-якій окремо взятій системі типів є підтипами самого верхнього. Це є протилежністю найнижчих типу, або інакше іменованого універсальним підтипом, який являє собою тип, який не містить в собі ніяких вкладених членів (тобто у нього немає підтипів).


Підтримка в мовах програмування

Деякі типізовані мови програмування забезпечують явну підтримку вищого типу.

Більшість об'єктно-орієнтованих мов програмування включають в себе універсальний базовий клас :
Назва Мови
Object Smalltalk, Java, JavaScript, Ruby і деякі інші. У Java він часто позначається з префіксом, що вказує на пакет, наприклад, 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. [1]
t Common Lisp і безліч інших діалектів Lisp.
Any Scala. [2]
GENERAL Eiffel.
UNIVERSAL Perl 5.
Variant Visual Basic аж до 6-ї версії.

C + + виділяється серед об'єктно-орієнтованих мов тим, що не має універсального супертіпа. Тип "покажчик на void" може приймати покажчик на будь-який об'єкт, навіть незважаючи на те, що void -тип сам по собі не є універсальним типом, а лише поодиноким типом.

Необ'ектно-орієнтовані мови зазвичай не мають універсального супертіпа (або повністю підтримують поліморфізм підтипів). Common Lisp є виключення в тому плані, що його вбудовані типи утворюють ієрархію типів, навіть коли його об'єктна система CLOS не використовується.

У більшості мов програмування вищий тип - це абстрактний тип, який не містить елементів, які не є елементами деякого (оголошеного) підтипу. В даному випадку Java є винятком: вираз new Object() цілком коректно.

Вищий тип використовується як "узагальнений" (generic) тип, в першу чергу в мовах без підтримки параметричного поліморфізму. Наприклад, до додавання узагальнених типів в Java 5, колекція класів в бібліотеці Java (виключаючи масиви Java) підтримували посилання на тип Object; при цьому способі будь невласний тип може бути доданий в колекцію. Вищий тип також часто використовується для підтримки об'єктів невідомого типу.

У мовах зі структурною системою типів вищий тип - це порожня структура. Наприклад, об'єкти в OCaml структурно типізовані; порожній тип об'єкта (тип об'єкта, який не має методів), " < > ", - вищий тип для об'єктних типів. Будь-який об'єкт в OCaml може бути явним чином приведений до цього типу, хоча результат може бути досить даремним.

Вищий тип може також бути представлений як неявний тип в мовах з нестатичні типізацією. Мови з динамічною типізацією часто підтримують понижуючий приведення (або "уточнення типу" (type refinement)) для надання програмісту можливості вказувати більш специфічний тип для об'єкту в ході виконання програми. Необхідно відзначити, що знижує приведення з типу void * в мові C + + не може бути виконано в "безпечному" стилі, коли невдале приведення виявляється середовищем мови.


Примітки