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
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