Quand vous dites "type", je vais supposer que vous voulez surtout parler de type statique. Mais je parlerai bientôt des types dynamiques.
Un type statique est une propriété d'une partie d'un programme qui peut être prouvée de manière statique (statique signifie "sans l'exécuter"). Dans un langage à typage statique, chaque expression a un type, que vous l'écriviez ou non. Par exemple, dans le Cish "int x = a * b + c - d", a,b,c,et d ont des types, a * b a un type, a * b + c a un type et a * b + c -d a un type. Mais nous avons seulement annoté x avec un type. Dans d'autres langages, tels que Scala, C#, Haskell, SML et F#, même cela ne serait pas nécessaire.
Les propriétés qui peuvent être prouvées dépendent du vérificateur de type.
Une classe de style Scala, par contre, est juste la spécification d'un ensemble d'objets. Cette spécification comprend quelques informations de type et inclut de nombreux détails d'implémentation et de représentation tels que les corps de méthodes et les champs privés, etc. En Scala, une classe spécifie également certaines limites de modules.
De nombreux langages ont des types mais pas de classes et de nombreux langages ont des classes mais pas de types (statiques).
Il existe plusieurs différences observables entre les types et les classes. List[String] est un type mais pas une classe. En Scala, List est une classe mais normalement pas un type (il s'agit en fait d'un type supérieur). En C#, List n'est pas un type et en Java, c'est un "type brut".
Scala propose des types structurels. {def foo : Bar} désigne tout objet qui possède de manière prouvable une méthode foo qui renvoie un Bar, quelle que soit sa classe. C'est un type, mais pas une classe.
Les types peuvent être abstraits à l'aide de paramètres de type. Lorsque vous écrivez def foo[T](x : T) = ..., alors dans le corps de foo T est un type. Mais T n'est pas une classe.
Les types peuvent être virtuels en Scala (c'est-à-dire les "membres de type abstrait"), mais les classes ne peuvent pas être virtuelles avec Scala aujourd'hui (bien qu'il y ait une manière lourde de coder les classes virtuelles). https://wiki.scala-lang.org/display/SIW/VirtualClassesDesign )
Maintenant, les types dynamiques. Les types dynamiques sont des propriétés d'objets que le runtime vérifie automatiquement avant d'effectuer certaines opérations. Dans les langages OO basés sur des classes et typés dynamiquement, il existe une forte corrélation entre les types et les classes. La même chose se produit dans les langages JVM tels que Scala et Java, dont les opérations ne peuvent être vérifiées que dynamiquement, comme la réflexion et le casting. Dans ces langages, l'"effacement de type" signifie plus ou moins que le type dynamique de la plupart des objets est le même que celui de leur classe. Plus ou moins. Ce n'est pas le cas, par exemple, des tableaux qui ne sont pas typiquement effacés pour que le runtime puisse faire la différence entre Array[Int] et Array[String]. Mais rappelez-vous ma définition large "les types dynamiques sont des propriétés d'objets que le runtime vérifie automatiquement". Lorsque vous utilisez la réflexion, il est possible d'envoyer n'importe quel message à n'importe quel objet. Si l'objet supporte ce message, tout fonctionne. Il est donc logique de parler de tous les objets qui peuvent faire coin-coin comme un canard comme d'un type dynamique, même si ce n'est pas une classe. C'est l'essence même de ce que les communautés Python et Ruby appellent le "duck typing". De même, selon ma définition large, même "zeroness" est un type dynamique dans le sens où, dans la plupart des langages, le runtime vérifie automatiquement les nombres pour s'assurer que vous ne divisez pas par zéro. Il y a très, très peu de langages qui peuvent le prouver de manière statique en faisant de zéro (ou non zéro) un type statique.
Enfin, comme d'autres l'ont mentionné, il y a des types comme int qui n'ont pas de classe comme détail d'implémentation, des types comme Null et Any qui sont un peu spéciaux mais qui pourraient avoir des classes et n'en ont pas, et des types comme Nothing qui n'a même pas de valeurs et encore moins de classe.