Most people will instinctively assume that a sealed type cannot have implementations in another source file - that’s what a type being sealed means, right?
Well, not quite. A sealed type can only have direct subtypes in the same source file. But the constraint is not transitive and these subtypes, not being sealed themselves, can have subtypes declared in other files.
For example, having this in one file:
sealed trait Foo
class Bar extends Foo
We can absolutely extend Bar in another source file:
class FooBar extends Bar
This is perfectly correct as per the definition of sealed, and sometimes even desirable. It’s just not what most people expect.
For this reason, it’s preferable to default to final subtypes unless you have a good reason for them not to be.
| Linter | Rule |
|---|---|
| WartRemover |