Take the 2-minute tour ×

What makes a type different from class and vice versa?

(In the general language-agnostic sense)

share|improve this question
Effective C++, Item 19: Treat class design as type design. –  Brent81 Sep 13 '12 at 4:03
@Brent81: I guess it's a valid practical guideline, but could you explain what that means, for example in this case: type Stack with two classes: SmallStack (fast for small stacks, but scales poorly) and ScalableStack (scales well but high overhead for small stacks). –  mins Aug 5 at 10:29

16 Answers 16

up vote 48 down vote accepted

The following answer is from Gof book (Design Patterns )


In contrast, an objects's type only refers to its interface -the set of requests to which it can respond.

An object can have many type, and object of different classes can have the same type.

//example in c++
template<typename T> 
const T & max(T const & a,T const &b)
return a>b?a:b;  //> operator of the type is used for comparision

max function requires a type with operation > with its own type as one of it interface any class that satisfies the above requirement can be used to generate specific max function for that class.

share|improve this answer

I always think of a 'type' as an umbrella term for 'classes' and 'primitives'.

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass

share|improve this answer
nice and concise explanation :) –  aku Jan 22 '09 at 6:39
Well, in .NET it should be the same, even primitives are classes (or more exactly structs). –  dalle Jan 22 '09 at 7:10
@dalle: agreed, there is no inherent difference between type and class. Eddie's example is very C++/Java dependent. It's not at all THE definition. –  Robert Gould Jan 22 '09 at 7:16
I imagine it will be hard to get "THE" definition of a 'type' versus a class. So many languages have their own typing system. One definition I heard for .NET was that a 'type' includes both ref and value types, whereas a class is only used to describe ref types. –  Eddie Parker Jan 22 '09 at 15:28
Isn't int just a short-hand for System.Int32 kind of? In other words: int foo; // Type is int, class is System.Int32 ? –  Svish Jun 5 '09 at 8:14

Type is the umbrella term for all the available object templates or concepts. A class is one such object template. So is the structure type, the Integer type, the Interface type etc. These are all types

If you want, you can look at it this way: A type is the parent concept. All the other concepts: Class, Interface, Structure, Integer etc inherit from this concept.i.e They are types

share|improve this answer

To illustrate it the fastest way:

A Struct is a Type, but a Struct is not a Class.

As you can see, a Type is an "abstract" term for not only definitions of classes, but also structs and primitive data types like float, int, bool.

share|improve this answer
forget CLR it is language-agnostic question :) –  aku Jan 22 '09 at 6:36
Ok. Reference removed. –  icelava Jan 22 '09 at 6:42
I would remove references to heap too, it has nothing to do with explanation of type vs class –  aku Jan 22 '09 at 6:46
Let me try a different approach to the explanation. –  icelava Jan 22 '09 at 7:00
It would be fine to mention the .net CLR as an example of a framework in which there exist types that are not classes (Java could be cited as another, though .net has more kinds of types). An extra little wrinkle in .net, though, is that Type (capitalized as shown) is the short name of a system class (System.Type) which is used to hold descriptions of types. –  supercat Dec 3 '12 at 17:56

Type contains description of the data (i.e. properties, operations, etc),

Class is a specific type - it is a template to create instances of objects.

Strictly speaking class is a special concept, it can be seen as a package containing subset of metadata describing some aspects of an object.

For example in C# you can find interfaces and classes. Both of them are types, but interface can only define some contract and can not be instantiated unlike classes.

Simply speaking class is a specialized type used to encapsulate properties and behavior of an object.

Wikipedia can give you a more complete answer:

share|improve this answer

Type generally refers to the classification of primitive values - integers, strings, arrays, booleans, null, etc. Usually, you can't create any new types.

Class refers to the named set of properties and methods which an object is associated with when it is created. You can usually define as many new classes as you want, although some languages you have to create a new object and then attach methods to it.

This definition is mostly true, but some languages have attempted to combine types and classes in various ways, with various beneficial results.

share|improve this answer
In even the type impoverished language C you can create new types, but it has nothing like what people normally think of as classes except in so much as structs, records, and classes all sort-of resemble each other. –  James Iry Jul 9 '12 at 23:06

To add another example of distinction: in C++ you have pointer and reference types which can refer to classes, but are not classes in and of themselves.

Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"

Note that only one class is involved, but a near infinite number of types can be used. In some languages, function are considered "first-class-objects" in which case, the type of a function is a class. In others, the type of a function is merely a pointer. Classes generally have the concepts of being able to hold data, as well as operations on that data.

share|improve this answer

Types and classes are related but not identical. My take is that classes are used for implementation inheritance, whereas types are used for runtime substitution.

Here is a link explaining the substitution principle and why subclasses and subtypes are not always the same thing (in Java for example). The wikipedia page on covariance and contravariance has more information on this distinction.

share|improve this answer
Link is dead: another one about Types, Subtyping and Substitutabili ty. –  mins Aug 5 at 11:53

My thoughts are pretty much in line with aku's answer.

I see classes as a template for building objects, while types are a way to classify those objects, and provide us with an interface to them.

Python also adds metaclasses, that are just a mechanism to build classes, in the same way as classes build objects (and well, classes and metaclasses are both objects).

This response to the same question in lamba the ultimate seems to me like a perfect explanation.

share|improve this answer

I think of a type as being the set of things you can do with a particular value. For instance, if you have an integer value, you can add it to other integers (or perform other arithmetic operations), or pass it to functions which accept an integer argument. If you have an object value, you can call methods on it that are defined by its class.

Because a class defines what you can do with objects of that class, a class defines a type. A class is more than that though, since it also provides a description of how the methods are implemented (something not implied by the type) and how the fields of the object are laid out.

Note also that an object value can only have one class, but it may have multiple types, since every superclass provides a subset of the functionality available in the object's class.

So although objects and types are closely related, they are really not the same thing.

share|improve this answer

Type is conceptually a superset of class. In the broader sense, a class is one form of type.

Closely related to classes are interfaces, which can bee seen as a very special kind of class - a purely abstract one. These too are types.

So "type" encompasses classes, interfaces and in most languages primitives too. Also platforms like the dot-net CLR have structure types too.

share|improve this answer
they are different in java –  yesraaj Jan 22 '09 at 6:01
rajKumar, your question is quite ambiguous. do you as about "type" as a feature of some language, or as a general concept? –  aku Jan 22 '09 at 6:04
as a general concept –  yesraaj Jan 22 '09 at 6:09
Not all user-defined types are classes though, at least not in all languages. –  jalf Jan 22 '09 at 6:12
jalf, agree it is a wrong characteristics. interface is user-defined too, and there can be no user-defined types. Class is a specialized type serving special needs (creating instances of objects) –  aku Jan 22 '09 at 6:14

Interesting question. I think aku's answer is spot on. Take the java ArrayList class as an example

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

An instance of the ArrayList class is said to be of type of every superclass it extends and every interface it implements. Therefore, an instance of the ArrayList class has a type ArrayList, RandomAccess, Cloneable, and so forth. In other words, values (or instances) belong to one or more types, classes define what these types are.

share|improve this answer

Different classes may describe the same type.

Type consists of these parts:

  1. Operations = syntax
  2. Description of operations = semantics

Class consists of these parts:

  1. Operations = syntax
  2. Implementation (= various implementations describe same semantics)

Some notes:

  • Interface (as in Java) is not type, because it does not describe semantics (describes only syntax)

  • Subclass is not subtype, because subclass may change semantics defined in superclass, subtype cannot change supertype semantics (see Liskov Substitution Principle, e.g. this LSP example).

share|improve this answer

Obviously, as there are languages with type system that are not OO programming languages, type must be a broader concept than class

Even in languages like Java, int is a (primitive) type, but not a class.

Hence: every class is a type, but not every type is a class.

share|improve this answer
A class is an implementation of a type, i.e. a type is an abstract description, a class is a concrete factory of objects. A car could be seen as an idea of a transport vehicle, a Ford Mustang blueprint is a class of vehicle, your Ford Mustang is an object of type car, and an instance of the Ford Mustang blueprint. –  mins Aug 5 at 11:10
There are 2 ways to produce objects of a given type: as an instance of a class, or as an element of a set for primitive (predetermined) types. Java int type is the set of elements from -2147483648 to 2147483647 (Java 7), see specs at §4.2.1, Note that a primitive type definition also includes the operations that are possible on the object of this type, see specs §4.2.2 for int. –  mins Aug 5 at 11:29

If we think to this question in C# context, we reach bellow answer.

C# type system is divided into following categories:

Value types:

  • Simple types: like int, long, float, etc.
  • Enum types
  • Struct types
  • Nullable types

Reference types:

  • Class types
  • Interface types
  • Array types
  • Delegate types

As you can see there are many types in C# which Class is only one of them. There is just one important note: C#’s type system is unified such that a value of any type can be treated as an object. Every type in C# directly or indirectly derives from the object class type, and object is the ultimate base class of all types. Values of reference types are treated as objects simply by viewing the values as type object. Values of value types are treated as objects by performing boxing and unboxing operations.

so as I see, type is an umbrella over many items which class is one of them.

Referece: CSahrp Language Specification doc, page 4

share|improve this answer

Inspired by Wikipedia...

In type theory terms;

  • A type is an abstract interface.

  • A class represents an implementation of the type.
    It is a concrete data structure and collection of subroutines


    *For example, one might implement the type Stack with two classes: SmallStack (fast for small stacks, but scales poorly) and ScalableStack (scales well but high overhead for small stacks).*

    Similarly, a given class may have several different constructors.

enter image description here

The banana example.

  • A Banana type would represent the properties and functionality of bananas in general.

  • The ABCBanana and XYZBanana classes would represent ways of producing bananas.
    (Different banana suppliers in real life, or different data structures and functions to represent and draw bananas in a video game).

    The ABCBanana class could then produce particular bananas which are instances of the ABCBanana class, they would be objects of type Banana.

It is not rare the programmer provide a single and only implementation for a type. In this case the class name is often identical with the type name. But there is still a type (which could be extracted in an interface if required), and an implementation (which would implement the separate interface) which builds instances (objects) of the class.

share|improve this answer

Your Answer


