E068: Cannot Extend AnyVal

This error is emitted when a trait or object attempts to extend AnyVal.

Only classes can extend AnyVal to become value classes. Traits may extend Any to become "universal traits" which may only have def members. Universal traits can be mixed into classes that extend AnyVal.


Example

trait MyValueTrait extends AnyVal

Error

-- [E068] Syntax Error: example.scala:1:6 --------------------------------------
1 |trait MyValueTrait extends AnyVal
  |      ^
  |      trait MyValueTrait cannot extend AnyVal
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | Only classes (not traits) are allowed to extend AnyVal, but traits may extend
  | Any to become "universal traits" which may only have def members.
  | Universal traits can be mixed into classes that extend AnyVal.
   -----------------------------------------------------------------------------

Solution

// Use a class for value classes
class MyValueClass(val value: Int) extends AnyVal
// For traits, extend Any to create a universal trait
trait MyUniversalTrait extends Any:
  def method: Int

class MyValueClass(val value: Int) extends AnyVal with MyUniversalTrait:
  def method: Int = value