The Sorbet syntax for type annotations representing arrays, hash maps, and other containers defined in the Ruby standard library looks different from other [class types](/docs/class-types) despite the fact that Ruby uses classes to represent these values, too. Here's the syntax Sorbet uses:| sorbet.org
> **Note**: Class types are used to describe values that are instances of a class---these are the most commonly used types. To instead learn about types for class objects themselves, see [T.class_of](/docs/class-of).| sorbet.org
**Exhaustiveness checking** is a feature of a language where the type checker guarantees that the programmer has covered all cases. It can be super useful at catching pesky edge cases before they become bugs, and Sorbet supports it as a first class feature.| sorbet.org
There are two primary metrics that we recommend to track adoption of Sorbet in a codebase:| sorbet.org
## Why does Sorbet think this is `nil`? I just checked that it's not!| sorbet.org
> TODO: This page is still a fragment. Contributions welcome!| sorbet.org
Classes are also values in Ruby. Sorbet has two ways to describe the type of these class objects: `T.class_of(...)` and `T::Class[...]`.| sorbet.org
Sorbet supports sealed classes. Sealed classes restrict who's allowed to subclass a class. This is a considerably advanced feature, but it's also considerably powerful. That being said, if you're already familiar with the concept, here's what the syntax looks like in Sorbet:| sorbet.org
Sorbet supports marking methods, classes, and modules "final", which limits how they can be overridden and extended, making some patterns easier to reason about and depend on.| sorbet.org
Recall from [Enabling runtime checks](/docs/runtime) that `sorbet-runtime` raises| sorbet.org
Sorbet is a gradual type checker, which is a blessing and a curse.| sorbet.org
There are five ways to assert the types of expressions in Sorbet:| sorbet.org
This is one of three docs aimed at helping answer common questions about Sorbet:| sorbet.org
Sorbet implements a **control flow-sensitive** type system. It models control| sorbet.org
Union types declare that a value either has one type, or some other type. The| sorbet.org
This doc will cover how to enable and disable the **static checks** that Sorbet| sorbet.org
> This page describes the syntax of method signatures, or `sig`s. For a complete| sorbet.org
Type checking with Sorbet is composed of two key components:| sorbet.org
A static type checker for Ruby| sorbet.org
The type `T.untyped` represents a type that Sorbet has no specific knowledge| sorbet.org
```ruby| sorbet.org
| sorbet.org
> This feature is experimental and might be changed or removed without notice.| sorbet.org
## Step 1: Install dependencies| sorbet.org
Sorbet provides the most value when it has a wealth of programmer-supplied| sorbet.org
Sorbet supports abstract classes, abstract methods, and interfaces. Abstract| sorbet.org
`T.attached_class` can be used to refer to the type of instances from a| sorbet.org
Sorbet has syntax for creating generic methods, classes, and interfaces.| sorbet.org
As we've mentioned before, Sorbet is a [gradual](/docs/gradual) system: it can be| sorbet.org
Sorbet can track when a value is allowed to be `nil`, or when a value of a| sorbet.org
Sorbet supports method override checking. These checks are implemented as `sig`| sorbet.org
Intersection types are how we overlap two types, declaring that an expression| sorbet.org
RBI files are "Ruby Interface" files. Sorbet uses RBI files to learn about| sorbet.org