Programmer dictionary: Class vs Type vs Object
Class and type are often used interchangeably, while they have the different meaning. What are they? How they both relate to an object? In this article, we are going to explore differences and relations between all of them.


Object vs Class
The difference between object and class should be intuitive to most programmers:
Class is a blueprint or template from which objects are created.
Object is an instance of a class.
Here is a simple example:
class A
val a = A()
In above example A is a class, but a is pointing to an object. Class is what is defined using:
classkeyword- object declaration
- object expression
- companion object
All objects are instances created using this templates. We can create multiple objects for a class defined using class keyword, but for object declaration, object expression and companion object there is a single object created.
Class vs Type
It was simple, but what about the difference between class and type? People are often asking: “Is String a type or a class?”. The common answer is “Both because every class is a type”. It is not really true. We need to distinguish two different things:
- Classifiers, i.e. classes and interfaces
- Types
Classifiers generate a set of types. Let’s look at the example:
class A
val a = A()
We can say that in the above snippet we see definition of class A, but the type of a is A. Therefore A is both a name of the class and of the type. The class is a template for an object but concrete object have a type. Actually, every expression has a type! Here is a good simplification of class and type definitions:
A type summarizes the common features of a set of objects with the same characteristics. We may say that a type is an abstract interface that specifies how an object can be used.
A class represents an implementation of the type. It is a concrete data structure and collection of methods.
We’ve said that every classifier generates a set of types. In most cases, it generates a single type, but an example where a single class generates multiple types is a generic class:
class Box<T>
The Box is a class, while Box<Int>, Box<A>, Box<List<String>> are types generated by generic class Box. Note that primitives and arrays in Java do not have a class or interface but they are types.
All this nomenclature comes from category theory which is highly adapted to theoretical computer science. If you need more, here is a great university article about the distinction between type and class.
This post is the fifth part of the Kotlin programmer dictionary. To stay up-to-date with new parts, just follow this medium or observe me on Twitter. If you need some help then remember that I am open for consultations.
If you like it, remember to clap. Note that if you hold the clap button, you can leave more claps.
Here are other parts of the Kotlin programmer dictionary:
- Parameter vs Argument, Type parameter vs Type argument
- Statement vs Expression
- Function vs Method vs Procedure
- Property vs Field
- Object expression vs Object declaration
- Receiver
- Implicit receiver vs Explicit receiver
- Extension receiver vs Dispatch receiver
- Receiver type vs receiver object
- Function Type vs Function literal vs Lambda expression vs Anonymous function
- Higher-order function
- Function literal with receiver vs Function type with receiver
- Invariance vs Covariance vs Contravariance
- Event listener vs Event handler
- Delegation vs Composition



