あらゆるタイプ

型理論コンピュータサイエンスにおいて、型システムにはトップ型ユニバーサル型またはany(多くの場合、 ダウンタック)記号で表されます)が含まれます。これらの型は、他のすべての型をサブタイプとして含みます。トップ型は、対象となる型システム内の他のすべての型がそのサブタイプであるため、ユニバーサルまたはユニバーサルスーパータイプと呼ばれることもあります。オブジェクト指向言語では、すべての可能なオブジェクトを表すため、オブジェクトと呼ばれることがよくあります。

上位型は、下位型(他のすべての型がスーパータイプであるユニバーサルサブタイプ)とは対照的です。下位型は、サブタイプを全く含まない型です。

プログラミング言語のサポート

いくつかの型付きプログラミング言語では、トップ型を明示的にサポートしています。

静的に型付けされた言語では、トップ型について説明するときに、混同されやすい 2 つの異なる概念があります。

  1. 実行時クラス階層オブジェクト指向プログラミングでよく使用される)または型階層の最上位にあるユニバーサル基本クラスまたはその他の項目。この実行時)型を使用してオブジェクトを作成できることが多く、または、それをサポートする言語で型階層をプログラム的に調べると見つかることもあります。
  2. コード内の(コンパイル時の静的型。その変数には任意の値(または任意のオブジェクトポインタ値などのサブセット)を割り当てることができます。動的型付けに似ています。

最初の概念は多くの場合、2番目の概念を暗示します。つまり、ユニバーサル基底クラスが存在する場合、このクラスのオブジェクトを指す変数は、任意のクラスのオブジェクトを指すこともできます。しかし、いくつかの言語(例えば、C、Objective -C、Go )void*には、上記の2番目の概念に該当する型があります。これらの静的型は、変数が任意のオブジェクト値を受け入れることができますが、型システムにおいてオブジェクトが持つことができる実際の実行時型を反映していないため、 1番目の概念では最上位の型ではありません。 idinterface {}

動的型付け言語では、2番目の概念は存在しません(いずれにせよ、どの変数にも任意の値を代入できます)。そのため、1番目の概念(クラス階層)のみを解説します。この記事では、上位型について解説する際には1番目の概念に重点を置きますが、2番目の概念が重要な言語では、この概念についても言及します。

ほとんどのオブジェクト指向プログラミング言語には、ユニバーサル基本クラスが含まれています。
名前言語
ObjectSmalltalkJavaScript、その他。
java.lang.ObjectJava。パッケージ接頭辞なしで と表記されることが多いObject。また、プリミティブ型のスーパータイプではない。しかし、Java 1.5以降では、オートボクシングによって、プリミティブ値を に暗黙的または明示的に型変換Objectできるようになった。例:((Object)42).toString()
System.Object[ 1 ]C#Visual Basic (.NET)、およびその他の.NETフレームワーク言語
std::anyC++17以降のC++
std::any::Anyさび
objectPythonはunifying以降typeclassバージョン2.2 [ 2 ]でサポートされています(新しいスタイルのオブジェクトのみ。2.xの古いスタイルのオブジェクトには基底クラスとしてこれが存在しません)。新しいtypingモジュールは、Any任意の型と互換性があり、その逆も可能な typeを導入します。
TObjectオブジェクトパスカル
tLisp 、 Common Lispなどの多くの方言
Any?コトリン[ 3 ]
AnyScala[ 4 ] Swift[ 5 ] Julia[ 6 ] Python [ 7 ]
ANYエッフェル[ 8 ]
UNIVERSALパール5
VariantVisual Basicバージョン6まで、D [ 9 ]
interface{}またはany行く
BasicObjectルビー[ 10 ]
anyそしてunknown[ 11 ]TypeScriptunknownバージョン3.0で導入された[ 12 ]
mixedPHP(バージョン8.0以降)

次のオブジェクト指向言語にはユニバーサル ベース クラスがありません。

  • C++ には のようなユニバーサル クラスはありませんObject
  • Objective-C。クラスの親クラスを指定せずに新しい基底クラスを作成することは可能ですが、これは非常にまれです。 は、オリジナルObjectのObjective-Cランタイムでは慣例的に基底クラスとして使用されます。OpenStepおよびCocoa Objective-Cライブラリでは慣例NSObjectユニバーサル基底クラスです。オブジェクトへのポインタの最上位型は ですid
  • Swift。クラスの親クラスを指定せずに、新しい基底クラスを作成することができます。プロトコルはAny任意の型を受け入れることができます。

その他の言語

オブジェクト指向でない言語では、通常、ユニバーサル スーパータイプまたはサブタイプのポリモーフィズムのサポートはありません。

Haskellは意図的にサブタイプを省略していますが、パラメトリック多態性を含むいくつかの形態の多態性を備えています。最も一般的な型クラスパラメータは、制約のないパラメータa型クラス制約なし)です。Rustでは<T: ?Sized>最も一般的なパラメータです(はデフォルトで 特性を暗黙的<T>に含むため、 はそうではありませんSized)。

トップ型はジェネリック型として使用され、特にパラメトリック多態性のない言語ではよく使用されます。たとえば、Java 5でジェネリックが導入される前は、Java ライブラリのコレクション クラス (Java 配列を除く) は、型 の参照を保持していましたObject。このようにして、非固有型をコレクションに挿入できました。トップ型は、不明な型のオブジェクトを保持する場合にもよく使用されます。Java は、 で表される「ワイルドカード?型パラメータ」をサポートしています。たとえば、 は任意の型 (ただしnullList<?>は除く) を保持できるリストを示します。ワイルドカードは境界付きで指定でき、 は (それぞれ) 型の祖先クラスから継承した型または祖先クラスである型(それ自体を含む)を保持できるリストを示します。ただし、ワイルドカードは上限と下限の両方を同時に持つことはできません。 List<? extends T>List<? super T>TT

最上位の型は、非静的型付け言語における暗黙の型と見なすこともできます。実行時型付け言語では、実行時にオブジェクトのより具体的な型を検出できるように、ダウンキャスト(または型リファインメント)が提供されることがよくあります。

CおよびC++では、voidポインタ型( )は、 void型がユニバーサル型ではなくユニット型void*であるにもかかわらず、関数以外の任意のポインタを受け入れることができます。C++では、 からのダウンキャストは安全に行うことができず、失敗したダウンキャストは言語ランタイムによって検出されます。 void*

構造型システムを持つ言語では、空の構造体 が最上位の型として機能します。例えば、OCamlのオブジェクトは構造的に型付けされます。空のオブジェクト型(メソッドを持たないオブジェクトの型)< >は、オブジェクト型の最上位の型です。OCaml のオブジェクトはすべてこの型に明示的にアップキャストできますが、その結果は役に立ちません。Go でも構造型付けが採用されており、すべての型は空のインターフェース を実装しています。このインターフェースにはメソッドinterface {}ありませんが、より具体的な型にダウンキャストすることは可能です。

論理的に

topの概念は命題論理にも見られ、あらゆる解釈において真となる式に結びついています。述語論理においても同様の意味を持ちます。記述論理において、top はすべての概念の集合を指すために使用されます。これは、プログラミング言語における top 型の使用法と直感的に似ています。例えば、複数の記述論理をサポートするWeb Ontology Language (OWL) では、top はクラス に対応しowl:Thing、すべてのクラスは のサブクラスですowl:Thing。(bottom 型または空集合は に対応しますowl:Nothing。)

参照

注記

参考文献