名義型別系統
此條目需要補充更多來源。 (2024年3月24日) |
在計算機科學中,如果一個類型系統是名義的(nominal)(也稱為名稱基礎的(name-based)),則數據類型的兼容性和等價性是通過明確地宣告和/或類型的名稱來決定的,稱之為名義型別系統(英語:nominal type system)。名義系統用於決定類型是否相等,以及一個類型是否為另一個類型的子類型。名義類型系統與結構系統相對,後者基於類型的結構進行比較,不需要明確宣告。
名義型別
名義型別代表兩個變數僅在它們的宣告命名相同類型時才具有型別相容性。例如在C語言中,同個翻譯單元中具有不同名稱的兩個 struct
型別永不被視為相容,即使它們具有相同的字段聲明。
然而,C也允許 typedef
宣告,引入了現有類型的別名。這些僅是語法上的,對於型別檢查不會區分類型和其別名。這個特性在許多語言中存在,當(例如)同一個原始整數型別在兩個語義上不同的情況下使用時,可能會導致型別安全性的損失。Haskell 提供了 C 風格的語法別名,形式上是 type
宣告,以及newtype
宣告,確實引入了一個新的、不同的類型,與現有類型同構。[1]
名義子類型別
同樣地,名義子類型表示一個類型是另一個類型的子類型,僅當在其定義中明確宣告為如此時才成立。名義型語言(nominally-typed languages)通常會強制要求宣告的子類型在結構上相容(儘管 Eiffel 允許聲明非相容的子類型)。然而,那些在結構上相容但未宣告為子類型的子類型則不被認為是子類型。
C++、C#、Java、Objective-C、Delphi、Swift、Julia 和 Rust 等語言主要都使用名義型別和名義子類型別。
一些具有名義子類型的語言,像是Java和C#,允許類別被聲明為 final(或在C#中稱為 sealed),表示不允許進一步的創建子類型。
比較
名義型別在防止意外之類型等價方面很有用,這比結構型別提供了更佳的型別安全性。但其代價是減少了靈活性,例如名義型別不允許在不修改現有子類型的情況下創建新的父類型(super-types)。
參閱
參考文獻
- ^ Haskell 2010 Report: Declarations and Bindings: User-Defined Datatypes. [2015-06-02]. (原始內容存檔於2017-01-04).
資源
- Pierce, Benjamin C. §19.3 Nominal and Structural Type Systems. Types and Programming Languages. MIT Press. 2002: 253–. ISBN 0-262-16209-1.