un trait scellé est le même qu'une classe scellée?
En ce qui concerne sealed, oui. Ils partagent les différences normales entre traitet class, bien sûr.
Ou, sinon, quelles sont les différences?
Discutable.
Quand est-ce une bonne idée d'utiliser un trait scellé (et quand non)?
Si vous en avez un sealed class X, vous devez vérifier Xainsi que les sous-classes. Il n'en va pas de même pour sealed abstract class Xou sealed trait X. Donc, vous pourriez le faire sealed abstract class X, mais c'est beaucoup plus verbeux que juste traitet pour peu d'avantages.
Le principal avantage d'utiliser un abstract classsur un traitest qu'il peut recevoir des paramètres. Cet avantage est particulièrement pertinent lors de l'utilisation de classes de types. Disons que vous voulez construire un arbre trié, par exemple. Vous pouvez écrire ceci:
sealed abstract class Tree[T : Ordering]
mais vous ne pouvez pas faire ceci:
sealed trait Tree[T : Ordering]
puisque les limites de contexte (et les limites de vue) sont implémentées avec des paramètres implicites. Étant donné que les traits ne peuvent pas recevoir de paramètres, vous ne pouvez pas le faire.
Personnellement, je préfère sealed traitet l'utilise à moins qu'une raison particulière ne me fasse utiliser un sealed abstract class. Et je ne parle pas de raisons subtiles, mais de raisons que vous ne pouvez pas ignorer, telles que l'utilisation de classes de types.