Can an abstract class appear in a trait's allow only list?
← Sealed Types and Traits · Ref: Q850
A trait's 'allow only' list must contain only concrete classes. Abstract classes cannot be instantiated, so listing them in 'allow only' is meaningless and raises E05250.
WHY ONLY CONCRETE CLASSES
The 'allow only' mechanism restricts which classes can implement a trait. Since abstract classes cannot be instantiated directly, allowing them would create a gap: any concrete subclass of that abstract class could implement the trait without being explicitly listed. This defeats the purpose of sealing.
CORRECT PATTERN
List only concrete, instantiable classes:
Workable allow only FastWorker, SlowWorker execute() as abstract <- rtn as String?
INCORRECT PATTERN
Workable allow only AbstractHelper, ConcreteWorker // E05250
See Q130 for trait basics. See Q132 for sealed types. See Q134 for allow only patterns.
Example
defines module qa.sealed.allow.only.concrete defines class <?- Abstract helper class — cannot appear in allow only lists. -?> AbstractHelper as abstract execute() as abstract <- rtn as String? default operator ? <?- First concrete worker class. Can appear in allow only lists because it is concrete. -?> FastWorker execute() <- rtn as String: "fast" default operator ? <?- Second concrete worker class. Also eligible for allow only lists. -?> SlowWorker execute() <- rtn as String: "slow" default operator ? defines trait <?- Trait sealed to only FastWorker and SlowWorker. No other class can implement this trait. -?> Workable allow only FastWorker, SlowWorker execute() as abstract <- rtn as String? defines program AllowOnlyDemo() stdout <- Stdout() fast <- FastWorker() if fast? stdout.println(fast.execute())
Common mistakes
E05250 — Abstract classes cannot appear in allow only lists because they cannot be instantiated. Only list concrete classes that will implement the trait. See ek9 -h E05250 for details.
Incorrect:
Workable allow only AbstractHelper, SlowWorker
Correct:
Workable allow only FastWorker, SlowWorker
Other ways to ask this
- What is E05250 in EK9?
- Why must allow only list concrete classes?
- What types can appear in allow only?
- Can I seal a trait to abstract classes?
Coming from another language?
Java: sealed interfaces permit abstract classes (different design). Kotlin: sealed interfaces allow abstract implementations. Rust: no sealed traits (crate visibility instead). Scala: sealed traits allow abstract subtypes. EK9: E05250 requires all allow only entries to be concrete classes.
Keywords: restrict, instantiate, implement, only, trait, sealed, concrete, allow, E05250, abstract